• 2017.11.27 用Servlet在JSP中加入验证码


    登陆界面

    <%@ page pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>带图形验证码登录</title>
      </head>
      <body>
        <form name="form1" method="post">
        	用户名:<input type="text" name="userid" onclick="mes.innerHTML=''" value="${param.userid }"><br/>
        	密码:<input type="password" name="userpwd"  value="${param.userpwd }"><br/>
        	验证码:<input type="text" name="checkcode"/>
        	<input type="submit" value="换一张" onclick="form1.action='/servlet/changecheckcode'"/><br/>
        	
        	<input type="submit" value="登陆" onclick="form1action='/servlet/logincheck'"/>
        	<input type="reset" value="重置"/>
        	<div id="mes">${info}</div>
        </form>
      </body>
    </html>
    
    

    验证码的写入

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.util.*;
    import javax.imageio.*; 
    
    
    public class AuthImg extends HttpServlet
    {
        private Font mFont = new Font("Arial Black", Font.PLAIN, 16);
        public void init() throws ServletException
        {
            super.init();
        }
        Color getRandColor(int fc,int bc)
        {
            Random random = new Random();
            if(fc>255) fc=255;
            if(bc>255) bc=255;
            int r=fc+random.nextInt(bc-fc);
            int g=fc+random.nextInt(bc-fc);
            int b=fc+random.nextInt(bc-fc);
            return new Color(r,g,b);
        }
    
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            response.setHeader("Pragma","No-cache");
            response.setHeader("Cache-Control","no-cache");
            response.setDateHeader("Expires", 0);
            response.setContentType("image/jpeg");
            
            int width=100, height=18;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            
            Graphics g = image.getGraphics();
            Random random = new Random();
            g.setColor(getRandColor(200,250));
            g.fillRect(1, 1, width-1, height-1);
            g.setColor(new Color(102,102,102));
            g.drawRect(0, 0, width-1, height-1);
            g.setFont(mFont);
    
            g.setColor(getRandColor(160,200));
            for (int i=0;i<155;i++)
            {
                int x = random.nextInt(width - 1);
                int y = random.nextInt(height - 1);
                int xl = random.nextInt(6) + 1;
                int yl = random.nextInt(12) + 1;
                g.drawLine(x,y,x + xl,y + yl);
            }
            for (int i = 0;i < 70;i++)
            {
                int x = random.nextInt(width - 1);
                int y = random.nextInt(height - 1);
                int xl = random.nextInt(12) + 1;
                int yl = random.nextInt(6) + 1;
                g.drawLine(x,y,x - xl,y - yl);
            }
    
            String sRand="";
            for (int i=0;i<6;i++)
            {
       String tmp = getRandomChar();
                sRand += tmp;
                g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
             g.drawString(tmp,15*i+10,15);
            }
    
            HttpSession session = request.getSession(true);
            session.setAttribute("rand",sRand);
            g.dispose();
            ImageIO.write(image, "JPEG", response.getOutputStream());
        }
        private String getRandomChar()
        {
      int rand = (int)Math.round(Math.random() * 2);
      long itmp = 0;
      char ctmp = 'u0000';
      switch (rand)
      {
       case 1:
        itmp = Math.round(Math.random() * 25 + 65);
        ctmp = (char)itmp;
        return String.valueOf(ctmp);
       case 2:
        itmp = Math.round(Math.random() * 25 + 97);
        ctmp = (char)itmp;
        return String.valueOf(ctmp);
       default :
        itmp = Math.round(Math.random() * 9);
        return String.valueOf(itmp);
          }
        }
    }
    

    其中这是加了干扰线的了,并且用session来保存验证码了,
    在登陆的jsp页面中,应该这样设置
    验证码如图:

    <img src="authImg" id="authImg"/>看不清?<a href="#" onClick="refresh()">单击此处刷新</a>
    

    然后refesh()函数如下写

    <script>
       function refresh()
       {
        document.getElementById("authImg").src='authImg?now=' + new Date();
       }
      </script>
    

    之所以在最后加now,是防止浏览器的缓存

    最后再在web.xml里配置下servlet

    <servlet>
            <servlet-name>img</servlet-name>
            <servlet-class>org.yeeku.web.AuthImg</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>img</servlet-name>
         <url-pattern>/authImg</url-pattern>
        </servlet-mapping>
    
  • 相关阅读:
    子类构造函数中调用虚函数问题验证
    socks5代理浅识
    关于C++标准库(第2版)std::remove_if的"特性"概述
    动态获取结构体中指定的属性值
    构造和析构函数定义为私有场景
    remove_pointer使用测验
    广播自定义消息实现进程间的通信问题
    遍历窗口权限问题
    嵌入窗口到桌面的问题
    实验一 熟悉实验环境
  • 原文地址:https://www.cnblogs.com/qichunlin/p/7906693.html
Copyright © 2020-2023  润新知