用的是etmvc,获取不到验证码,求大神帮忙看看给点建议。下面是代码
验证码生成:GetCodeController.java
public class GetCodeController {
public void execute(HttpServletResponse response,HttpSession session) throws Exception{
//0.创建空白图片
BufferedImage image = new BufferedImage(100,30,BufferedImage.TYPE_INT_RGB);
//1.获取图片画笔
Graphics g = image.getGraphics();
Random r = new Random();
//2.设置画笔颜色
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
//3.绘制矩形的背景
g.fillRect(0, 0, 100, 30);
//4.调用自定义的方法,获取长度为5的字母数字组合的字符串
String number = getNumber(5);
//将图片字符存入session,用于验证码检查使用
session.setAttribute("scode", number);
g.setColor(new Color(0,0,0));
g.setFont(new Font(null,Font.BOLD,24));
//5.设置颜色字体后,绘制字符串
g.drawString(number, 5, 25);
//6.绘制8条干扰线
for(int i=0;i<8;i++){
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.drawLine(r.nextInt(100), r.nextInt(30), r.nextInt(100), r.nextInt(30));
}
response.setContentType("image/jpeg");
OutputStream ops = response.getOutputStream();
ImageIO.write(image, "jpeg", ops);
ops.close();
}
private String getNumber(int size){
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String number = "";
Random r = new Random();
for(int i=0;i<size;i++){
number+=str.charAt(r.nextInt(str.length()));
}
return number;
}
}
登陆页面部分代码 login.jsp
javascript部分
function reloadcode()
{
//直接刷新页面获得不同验证码
window.location.href="${ctx}/sys/home/login";
}
html部分
<tr>
<td class="login_info" colspan="2">验证码:</td>
<td class="width70" ><input name="code" type="text" class="width70" /></td>
<td width="92" style="text-align:center"><img alt="看不清楚,换一张" src="${ctx}/sys/GetCode/execute"
onclick="reloadcode();" id="code" style="position:relative;top:1px;left:0px;"></td>
</tr>
验证登陆页面 部分UserController.java
login方法
public JsonView login() throws Exception{
Map<String,Object> result = new HashMap<String,Object>();
String loginname = getRequest().getParameter("loginname");
String loginpwd = getRequest().getParameter("password");
//查看输入验证码
String scode = getRequest().getParameter("scode");
//获取验证码
String scodes = (String) session.getAttribute("scode");
System.out.println(scodes);
System.out.println(loginname);
System.out.println(loginpwd);
Map param=new HashMap();
param.put("loginname", loginname);
QueryParam qp=QueryParam.getInstance("from UserVO where loginname=:loginname",param);
UserVO vo=(UserVO)this.getBasBS().queryOne(qp);
//判断验证码
if(!scode.equals(request.getSession().getAttribute("scode"))){
//验证码错误
result.put("code_error","验证码错误");
result.put("failure", true);
}
if(vo==null){
result.put("msg", "用户名称不存在!");
result.put("failure", true);
}else{
if (vo.getState()==1){
result.put("msg", "用户已禁用!");
result.put("failure", true);
}
if(MD5Util.md5(loginpwd).equals(vo.getPassword())){
SessionInfo sessionInfo = new SessionInfo();
sessionInfo.setId(vo.getId());
sessionInfo.setName(vo.getName());
sessionInfo.setLoginname(vo.getLoginname());
sessionInfo.setOrgID(Long.parseLong(vo.getOrgid().toString()));
sessionInfo.setUsertype(vo.getUsertype());
//sessionInfo.setMenus(resourceBS.treeByIBatis(vo.getId(),null));
sessionInfo.setResourceList(resourceBS.resourceListByIBatis(vo.getId()));
session.setAttribute(GlobalConstant.SESSION_INFO, sessionInfo);
result.put("success", true);
}else{
result.put("failure", true);
result.put("msg", "密码错误!");
}
}
JsonView v = new JsonView(result);
v.setContentType("text/html;charset=utf-8");
return v; //new JsonView(result);
}
我是直接在验证码的src放的生成验证码的方法,不知道这样子方法是否有误,因为用的是etmvc我其他页面调用方法都这样调的,但是这里无法显示。UserController也获取不到生成的验证码。
------解决思路----------------------
自己的项目中用的是jsp页面直接生产图片
楼主可以看看
image.jsp页面
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
public Color getColor(){
Random random = new Random();
int r = random.nextInt(256);//0-255
int g = random.nextInt(256);
int b = random.nextInt(256);
return new Color(r,g,b);
}
public String getNum(){
String str = "";
Random random = new Random();
for(int i=0;i<4;i++){
str += random.nextInt(10);//0-9
}
return str;
}
%>
<%
response.setHeader("pragma", "mo-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);
BufferedImage image = new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(new Color(200,200,200));
g.fillRect(0,0,80,30);
for (int i = 0; i < 30; i++) {
Random random = new Random();
int x = random.nextInt(80);
int y = random.nextInt(30);
int xl = random.nextInt(x+10);
int yl = random.nextInt(y+10);
g.setColor(getColor());
g.drawLine(x, y, x + xl, y + yl);
}
g.setFont(new Font("serif", Font.BOLD,25));
g.setColor(Color.BLACK);
String checkNum = getNum();
StringBuffer sb = new StringBuffer();
for(int i=0;i<checkNum.length();i++){
sb.append(checkNum.charAt(i)+" ");
}
g.drawString(sb.toString(),5,23);
//将验证码放入HttpSession域对象中
session.setAttribute("CHECKNUM",checkNum);
ImageIO.write(image,"jpeg",response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%>
前台页面显示
<img src="${pageContext.request.contextPath}/muban/login/image.jsp" width="38" height="15">
------解决思路----------------------
LZ,你建个全新的 image.jsp 页面清空里面的内容,然后把1L的代码贴进去,保存! 然后在你要使用验证码的地方加上这句话<img src="image.jsp" width="38" height="15"> 就行了,如果是相对路径就这么写就OK了,我试了绝对OK的
------解决思路----------------------
一楼的没有问题的.
------解决思路----------------------
既然用了jsp生成了验证码,那就把生成的验证码保存,就在输入验证码的页面做验证吧.
------解决思路----------------------
一起提交也行,但是,验证码的验证就不用提交后验证吧.
------解决思路----------------------
在controller里 获得session
然后
session.getAttribute("CHECKNUM");
就可以得到验证码.
然后和传入的参数作对比
------解决思路----------------------
楼主的img标签是不是没加/>闭合..
页面直接生成不加后台验证不行的,那样直接发请求就直接略过验证码验证了可以
还有就是想问下etmvc发请求直接比如xxx/xxx/xxx就行了不用xxx/xxx/xxx.do什么的这样的吗?
是RESTful风格?但是又不知道哪里写了提交类型是getpost什么的
我去网上看看材料