当前位置: 代码迷 >> Java Web开发 >> 高分。jsp获取验证码有关问题
  详细解决方案

高分。jsp获取验证码有关问题

热度:359   发布时间:2016-04-16 21:46:11.0
高分求助。jsp获取验证码问题
用的是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的

------解决思路----------------------
一楼的没有问题的.
------解决思路----------------------
引用:
谢谢楼上各位,试了下可以,那么问题来了我怎么在controller做验证呢

既然用了jsp生成了验证码,那就把生成的验证码保存,就在输入验证码的页面做验证吧.
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

谢谢楼上各位,试了下可以,那么问题来了我怎么在controller做验证呢

既然用了jsp生成了验证码,那就把生成的验证码保存,就在输入验证码的页面做验证吧.


好吧 就是不能在后台验证跟帐号密码表单提交验证啊

一起提交也行,但是,验证码的验证就不用提交后验证吧.
------解决思路----------------------
在controller里 获得session

然后
session.getAttribute("CHECKNUM");
就可以得到验证码.
然后和传入的参数作对比
------解决思路----------------------
楼主的img标签是不是没加/>闭合..
页面直接生成不加后台验证不行的,那样直接发请求就直接略过验证码验证了可以
还有就是想问下etmvc发请求直接比如xxx/xxx/xxx就行了不用xxx/xxx/xxx.do什么的这样的吗?
是RESTful风格?但是又不知道哪里写了提交类型是getpost什么的
我去网上看看材料
  相关解决方案