Servlet实现验证码

来源:互联网 发布:sublime php 代码提示 编辑:程序博客网 时间:2024/06/10 08:28

Servlet实现验证码
import java.io.*;  
import javax.servlet.*;  
import javax.servlet.http.*;  
import java.awt.*;  
import java.awt.image.*;  
import javax.imageio.ImageIO;  
 
public class CheckCodeServlet extends HttpServlet  
{  
     private static final String CONTENT_TYPE = "text/html; charset=utf-8";  
     //设置字母的大小,大小  
     private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);  
     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++)  
         {  
             int itmp = random.nextInt(26) + 65;  
             char ctmp = (char)itmp;  
             sRand += String.valueOf(ctmp);  
             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));  
             g.drawString(String.valueOf(ctmp),15*i+10,16);  
         }  
  
         HttpSession session = request.getSession(true); 
       
         session.setAttribute("rand",sRand);
         g.dispose();  
         ImageIO.write(image, "JPEG", response.getOutputStream());  
        
     }  
    
     public void destroy()  
     {  
     }  


下一个主页提交的Servlet:

import java.io.*;  
import javax.servlet.*;  
import javax.servlet.http.*;  
 
public class LogonFormServlet extends HttpServlet  
{  
    public void service(HttpServletRequest request,  
        HttpServletResponse response) throws ServletException, IOException  
    {  
        response.setContentType("text/html;charset=GB2312");                  
        PrintWriter out = response.getWriter();   
          
        HttpSession session = request.getSession(false);  
        if(session == null)  
        {  
            out.println("验证码处理问题!");  
            return;  
        }  
          
        String savedCode = (String)session.getAttribute("check_code");  
        if(savedCode == null)  
        {  
            out.println("验证码处理问题!");  
            return;  
        }  
                  
        String checkCode = request.getParameter("check_code");  
        if(!savedCode.equals(checkCode))  
        {  
            /*验证码未通过,不从Session中清除原来的验证码, 
            以便用户可以后退回登录页面继续使用原来的验证码进行登录*/ 
            out.println("验证码无效!");  
            return;  
        }  
        /*验证码检查通过后,从Session中清除原来的验证码, 
        以防用户后退回登录页面继续使用原来的验证码进行登录*/ 
        session.removeAttribute("check_code");  
        out.println("验证码通过,服务器正在校验用户名和密码!");  
    }  
}  


web.xml
<servlet>  
        <servlet-name>CheckCodeServlet</servlet-name>  
        <servlet-class>CheckCodeServlet</servlet-class>  
    </servlet>      
    <servlet>  
        <servlet-name>LogonFormServlet</servlet-name>  
        <servlet-class>LogonFormServlet</servlet-class>  
    </servlet>    
    ……  
    <servlet-mapping>  
        <servlet-name>CheckCodeServlet</servlet-name>  
        <url-pattern>/authImage</url-pattern>  
    </servlet-mapping>  
    <servlet-mapping>  
        <servlet-name>LogonFormServlet</servlet-name>  
        <url-pattern>/servlet/LogonFormServlet</url-pattern>  
    </servlet-mapping>

JSP页面加上:
<img src="authImage">

 

原创粉丝点击