JavaWeb 使用Session实现一次性验证码
表单
<form action="loginServlet" method="post"> 请输入验证码:<input type="text" name="code" /> <img src="getCodeServlet" /><br /> <button type="submit">提交</button> </form>
载入页面时,会自动请求getCodeServlet,获取图片(验证码)。
getCodeServlet,产生验证码
1 @WebServlet("/getCodeServlet")
2 public class GetCodeServlet extends HttpServlet {
3 //验证码的宽、高
4 private static int WIDTH=80;
5 private static int HEIGHT=25;
6
7 //绘制背景
8 private void drawBg(Graphics g){
9 //rgb
10 g.setColor(new Color(128, 128, 128));
11 //绘制矩形。x,y,wigth,height
12 g.fillRect(0,0,WIDTH,HEIGHT);
13 //随机绘制100个干扰点
14 Random random=new Random();
15 for (int i=0;i<100;i++){
16 //产生(0,1)上的小数,*WIDTH|HEIGHT,再取整也行
17 int x=random.nextInt(WIDTH);
18 int y=random.nextInt(HEIGHT);
19 g.drawOval(x,y,1,1);
20
21 //干扰点的颜色也可以随机,随机产生red,green,blue即可
22 //g.setColor(new Color(red,green,blue));
23 }
24 }
25
26
27 //绘制验证码
28 private void drawCode(Graphics g,char[] code){
29 g.setColor(Color.BLACK);
30 //字体、样式(多个时竖线分隔)、字号
31 g.setFont(new Font("serif",Font.ITALIC|Font.BOLD,18));
32 //在不同位置绘制验证码字符,参数:要绘制的String、横、纵坐标。+""是为了char转String。
33 g.drawString(code[0]+"",1,17);
34 g.drawString(code[1]+"",16,15);
35 g.drawString(code[2]+"",31,18);
36 g.drawString(code[3]+"",46,16);
37 }
38
39 //随机产生4位验证码
40 private char[] getCode(){
41 String chars="0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
42 char[] code=new char[4];
43 Random random=new Random();
44 for (int i=0;i<4;i++){
45 //[0,62)
46 int index= random.nextInt(62);
47 code[i]=chars.charAt(index);
48 }
49 return code;
50 }
51
52
53 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
54 HttpSession session = request.getSession();
55 ServletOutputStream sos = response.getOutputStream();
56 response.setContentType("image/jpeg");
57
58 //设置浏览器不缓存此图片
59 response.setHeader("Pragma","No-cache");
60 response.setHeader("Cache-Control","no-cache");
61 response.setDateHeader("Expires",0);
62
63 //创建内存图片
64 BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, TYPE_INT_RGB);
65 Graphics g= bufferedImage.getGraphics();
66 char[] code=getCode();
67 //将验证码放到session域中。session对象要在提交响应之前获得
68 session.setAttribute("code",new String(code));
69 drawBg(g);
70 drawCode(g,code);
71 g.dispose();
72
73 //将图片输出到浏览器
74 ByteArrayOutputStream baos = new ByteArrayOutputStream();
75 ImageIO.write(bufferedImage,"JPEG",baos);
76 baos.writeTo(sos);
77 baos.close();
78 sos.close();
79 }
80
81 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
82 doPost(request,response);
83 }
84 }
loginServlet,处理表单
1 @WebServlet("/loginServlet")
2 public class LoginServlet extends HttpServlet {
3 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
4 response.setContentType("text/html;charset=utf-8");
5 HttpSession session = request.getSession();
6 String trueCode= (String) session.getAttribute("code");
7 String code=request.getParameter("code");
8
9 if (code.equals(trueCode)){
10 response.getWriter().write("验证码正确");
11 }
12 else {
13 response.getWriter().write("验证码错误");
14 }
15 }
16
17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
18 doPost(request,response);
19 }
20 }
上面的处理方式要区分验证码的大小写。
不区分大小写:
//先转换为全大写|全小写,再判断
trueCode=trueCode.toLowerCase();
code=code.toLowerCase();
//trueCode=trueCode.toUpperCase();
//code=trueCode.toUpperCase();
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h57442.shtml








