zoukankan      html  css  js  c++  java
  • Java Web实现登录验证码(Servlet+jsp)

    1.生成验证码图片(Servlet)

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
     
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     * Servlet implementation class VerifyCode
     */
    @WebServlet("/VerifyCode")
    public class VerifyCode extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public VerifyCode() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            this.doPost(request, response);
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 首先设置浏览器不缓存
            response.setHeader("cache-control", "no-cache"); 
            response.setHeader("Expire", "-1"); // >0为缓存 
            response.setHeader("pragma", "no-cache");
            // 存储正确的验证码
            String vali_code = "";
            String Vali_str = "abcdefghijklmnopqrstuvwsyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            Color[] colors =
                { Color.BLACK, Color.RED, Color.BLUE };
            // 1.创建图像
            int width = 110, height = 40;
            int x_offset = 5, y_offset = 28;
            BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
            // 2.创建画布
            Graphics2D g = img.createGraphics();
            // 3.为画布添加背景颜色为亮灰色
            g.setColor(Color.LIGHT_GRAY);
            g.fillRect(0, 0, width, height);//fillRect是包括矩形框内部 
            // 4.为画布添加边框
            g.setColor(Color.BLUE);
            g.drawRect(0, 0, width - 1, height - 1);//drawRect是绘制矩形边框
            // 5.绘制干扰线
            for (int i = 0; i < 10; i++)
            {
                g.setColor(new Color(randNum(0, 255), randNum(0, 255), randNum(0, 255)));
                g.drawLine(randNum(0, width), randNum(0, height), randNum(0, width), randNum(0, height));
            }
            g.setFont(new Font("黑体", Font.BOLD, 20));
            for (int i = 0; i < 4; i++)
            {
                int r = randNum(-180, 180);
                String code = Vali_str.charAt(randNum(0, Vali_str.length() - 1)) + "";
                g.rotate(r / 180 * Math.PI);
                g.setColor(colors[randNum(0, colors.length)]);
                g.drawString(code, x_offset + i * 30, y_offset);
                g.rotate(-r / 180 * Math.PI);
                vali_code += code;
            }
     
            //将验证码的内容存储在HttpSession中        
            HttpSession session = request.getSession();        
            session.setAttribute("Valicode", vali_code);
     
            // 通过response的输出流打给浏览器
            ImageIO.write(img, "jpg", response.getOutputStream());
        }
        private Random random = new Random();
        //随机生成begin和end之间的一个int值 
        private int randNum(int begin, int end)
        {
            return random.nextInt(end - begin) + begin;
        }
    }

    2.JSP显示验证码

     <input type="text" placeholder="输入验证码" name="ValiImage" id="ValiImage" /><!-- 输入验证码文本 -->
    <img src="VerifyCode" onclick="changeValiImage(this)"><!-- 验证码图片 -->
    
    <script type="text/javascript">
    
    		function changeValiImage(img){
    				img.src = "VerifyCode?time=" + new Date().getTime();//刷新
    		}
    	
    </script>
    

    3.进行用户输入和正确验证码的比对

    我在LoginServlet中

    //1 获得用户输入的验证码
            String verifyCode = request.getParameter("ValiImage");
            //2 获得服务器session 存放数据 ,如果没有返回null
            String sessionCacheData = (String) request.getSession().getAttribute("Valicode");
            // *将服务器缓存session数据移除
            request.getSession().removeAttribute("Valicode");
            // ** 判断服务器是否存在
            if(sessionCacheData == null){
            	request.setAttribute("message", "请不要重复提交");
                request.getRequestDispatcher("login.jsp").forward(request, response);
                return;
            }
            //3 比较
            if(! sessionCacheData.equalsIgnoreCase(verifyCode)){
                //用户输入错误
                // * 存放request作用域
            	request.setAttribute("message", "验证码输入错误");
                // * 请求转发
                request.getRequestDispatcher("login.jsp").forward(request, response);        
                return;
            }
    //接登录方法...
    

  • 相关阅读:
    LoadRunner测试结果分析
    安装LoadRunner时提示缺少vc2005_sp1_with_atl_fix_redist解决方案
    LoadRunner 11 安装及破解
    android批量文件上传(android批量图片上传)
    nginx优化配置
    redis节点管理-节点的移除
    jQuery获取表格隐藏域与ajax请求数据结合显示详情
    el表达式运算符
    EL表达式中获取list长度(JSTL函数用法)
    SQL之case when then用法(用于分类统计)
  • 原文地址:https://www.cnblogs.com/Arisf/p/14162223.html
Copyright © 2011-2022 走看看