zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    libuv 中文编程指南(一)序言
    一些鲜为人知却非常实用的数据结构
    libuv 中文编程指南(二)libuv 基础
    Zookeeper 的 Lua 绑定(二)
    高度怀疑
    不能没有你
    第一次看流星雨记
    调侃下蓝网队 我还是比较极端的 不要好 那就要坏吧
    摇滚校园
    守法公民
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/11423084.html
Copyright © 2011-2022 走看看