当前位置: 代码迷 >> Java Web开发 >> session绑定的验证码返回的是null,该怎么解决
  详细解决方案

session绑定的验证码返回的是null,该怎么解决

热度:242   发布时间:2016-04-16 21:43:35.0
session绑定的验证码返回的是null
else if(action.equals("/login")){
//number1:用户提交的验证码
String number1=request.getParameter("number");
//number2:session对象上绑定的验证码
HttpSession session=request.getSession();
String number2=(String)session.getAttribute("number");
if(!number1.equalsIgnoreCase(number2)){
request.setAttribute("number_error", "验证码错误");
request.getRequestDispatcher("login.jsp")
.forward(request,response);
return;
}
//只有在验证码正确的情况下,才会比较用户名和密码是否正确
String username = 
   request.getParameter("username");
   String pwd = 
   request.getParameter("pwd");
   UserDAO dao = new UserDAO();
   try {
        User user = dao.findByUserName(username);
//         System.out.println(user.getPwd()+",");
        try {
if(user != null && user.getPwd().equals(MD5Util.encrypt(pwd.toUpperCase()))){
//绑订数据到session对象上,用于验证
session.setAttribute("user", user);
//登录成功,跳转到主功能页面
response.sendRedirect("list.do");
}else{
//登录失败,提示用户
request.setAttribute("login_error", 
"用户名或密码错误");
request.getRequestDispatcher("login.jsp")
.forward(request, response);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        } catch (SQLException e) {
        e.printStackTrace();
        //将系统异常扔给容器来处理
        throw new ServletException(e);
        }
}





package web;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CheckcodeServlet extends HttpServlet {
private int WIDTH= 80;
private int HEIGHT= 30;
public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
//一、绘图
//step1,创建一个内存映像对象(画布)
BufferedImage image = 
new BufferedImage(WIDTH,HEIGHT,
BufferedImage.TYPE_INT_RGB);
//step2,获得画笔
Graphics g = image.getGraphics();
//step3,
Random r = new Random();
//step3,给画笔上一个随机的颜色
g.setColor(new Color(r.nextInt(255),
r.nextInt(255),r.nextInt(255)));
//step4,填充画布
g.fillRect(0, 0, WIDTH, HEIGHT);
//step5,在画布上绘图
// String number = r.nextInt(99999) + "";
String number ="";
// g.setColor(new Color(0,0,0));
for (int i = 0; i < 4; i++) {
g.setColor(new Color(r.nextInt(255),
r.nextInt(255),r.nextInt(255)));
int h=(int)(HEIGHT*0.3+(HEIGHT*0.7)*r.nextDouble());
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,h));
String str=getNumber(1);
number+=str;
g.drawString(str, i*WIDTH/5, h);
}
//将number 绑定到session上
HttpSession session =request.getSession();
session.setAttribute("number", number);

//step6,设置字体的大小、风格
// g.setFont(new Font(null,
// Font.ITALIC|Font.BOLD,20));
// g.drawString(number, 5, 22);
//加干扰线
for (int i = 0; i < 3; i++) {
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255),r.nextInt(255)));
    g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT),r.nextInt(WIDTH), r.nextInt(HEIGHT));
}
//二、压缩图片,输出
response.setContentType("image/jpeg");
OutputStream ops = 
response.getOutputStream();
//write方法:将原始图片(image)使用
//指定的压缩算法(jpeg)进行压缩,然后
//使用指定的输出流(ops)输出。
ImageIO.write(image, "jpeg", ops);
ops.close();
}/*返回一个指定长度的字符串
  要求从A~Z,0~9中随机选取字符
 */
   
private String getNumber(int size) {
Random r=new Random();
String strs="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+"0123456789";
String number="";
for (int i = 0; i < size; i++) {
number+=strs.charAt(r.nextInt(strs.length()));
}

return number;
}

}


------解决思路----------------------
额,你的验证码是个类文件,你的页面调用CheckcodeServlet这个类没有,让他对session里面的验证码初始化应该就有值了把
------解决思路----------------------
你可以在CheckcodeServlet?类的47行下面写个打印语句,System.out.println(number);,看看是否给number赋值成功
------解决思路----------------------
你在登录页面能看到验证码吗?如果你登录页面能看到验证码,说明验证码生成成功了,是你放置在session中出问题了,或者在其他的地方将session的清掉了;如果登录页面没看到验证码,说明生成验证码的地方又问题,
------解决思路----------------------

你这个地方写的有问题吧,看的方法,是想String str=getNumber(i)生成字符串,然后拼接的,但是寄传进去的是1,这样的话,str的值一直是空的,拼出来的number也是空的,下次要仔细啊
------解决思路----------------------
引用:
你可以在CheckcodeServlet?类的47行下面写个打印语句,System.out.println(number);,看看是否给number赋值成功


------解决思路----------------------
楼主是不是禁用cookie了?
------解决思路----------------------
我一般是将 生成的验证码后保存到session中。
  相关解决方案