现在的位置: 首页 > 综合 > 正文

servlet彩色验证码

2013年08月24日 ⁄ 综合 ⁄ 共 9283字 ⁄ 字号 评论关闭

用image.jsp 的彩色验证出现"     ...     "的错误 

使用servlet验证

pp.function.VerifyCodeServlet
package pp.function;

import   java.io.*;  
import   java.awt.Color;  
import   java.awt.Font;  
import   java.awt.Graphics;  
import   java.awt.GraphicsEnvironment;  
import   java.awt.image.BufferedImage;  
import   java.io.IOException;  
import   java.util.Random;  
import   javax.imageio.IIOImage;  
import   javax.imageio.ImageIO;  
import   javax.imageio.ImageWriter;  
import   javax.imageio.plugins.jpeg.JPEGImageWriteParam;  
import   javax.imageio.stream.ImageOutputStream;  
import   javax.servlet.*;  
import   javax.servlet.http.*;  
 
 
public   class   VerifyCodeServlet   extends   HttpServlet  
{  
          private   static   final   int   IMAGE_WIDTH   =   60;  
          private   static   final   int   IMAGE_HEIGHT   =   20;  
          private   static   final   int   FONT_HEIGHT   =   16;  
          private   static   final   String   SVG_SOURCE1   =   "<!DOCTYPE   svg   PUBLIC   /"-//W3C//DTD   SVG   1.0//EN/"   /"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd/">"  
                  +   "<svg   width=/""  
                  +   IMAGE_WIDTH  
                  +   "/"   height=/""  
                  +   IMAGE_HEIGHT  
                  +   "/"   xmlns=/"http://www.w3.org/2000/svg/">"  
                  +   "<text   x=/"0/"   y=/""  
                  +   IMAGE_HEIGHT  
                  +   "/"   font-family=/"Arial/"   font-size=/""  
                  +   IMAGE_HEIGHT   +   "/"   fill=/"black/">";  
 
          private   static   final   String   SVG_SOURCE2   =   "</text></svg>";  
 
 
          private   boolean   svgMode   =   false;  
          private   PrintWriter   out   =   null;  
 
 
          protected   void   service(HttpServletRequest   arg0,   HttpServletResponse   arg1)   throws   ServletException,   IOException    
          {  
                  //if   (sn   ==   null)  
                          //   return;  
                             
                  String   vcode   =   sn2vcode();  
 
                  arg0.getSession().setAttribute("rand",vcode)   ;//代码内容写入session中  
 
                  if   (svgMode)  
                            outSVG(vcode,   arg1);  
                  else  
                            outJPEG(vcode,   arg1);  
          }  
 
 
          private   void   outSVG(String   vcode,   HttpServletResponse   resp)   throws   IOException    
          {  
                  resp.setContentType("image/svg+xml");  
                  resp.getOutputStream().print(SVG_SOURCE1   +   vcode   +   SVG_SOURCE2);  
          }  
 
          private   void   outJPEG(String   vcode,   HttpServletResponse   resp)   throws   IOException    
          {  
                  resp.setContentType("image/jpeg");  
                  BufferedImage   image   =   new   BufferedImage(IMAGE_WIDTH,   IMAGE_HEIGHT,  
                            BufferedImage.TYPE_INT_RGB);  
                  Random   random   =   new   Random();  
                  Graphics   g   =   image.getGraphics();  
                  //g.setColor(getRandColor(200,   250));  
                  g.fillRect(0,   0,   IMAGE_WIDTH,   IMAGE_HEIGHT);  
                  g.setFont(new   Font("Times   New   Roman",   Font.PLAIN,   18));  
                  //g.setColor(getRandColor(160,   200));  
                  for   (int   i   =   0;   i   <   155;   i++)    
                  {  
                            int   x   =   random.nextInt(IMAGE_WIDTH);  
                            int   y   =   random.nextInt(IMAGE_HEIGHT);  
                            int   xl   =   random.nextInt(12);  
                            int   yl   =   random.nextInt(12);  
                            g.drawLine(x,   y,   x   +   xl,   y   +   yl);  
                  }  
                  for   (int   i   =   1;   i   <=   4;   i++)    
                  {  
                            String   rand   =   vcode.substring(i   -   1,   i);  
                            g.setColor(new   Color(20   +   random.nextInt(110),   20   +   random.nextInt(110),   20   +   random.nextInt(110)));  
                            g.drawString(rand,   13   *   (i   -   1)   +   0,   16);  
                  }  
                  ImageWriter   writer   =   (ImageWriter)   ImageIO.getImageWritersByFormatName("jpeg").next();  
                  JPEGImageWriteParam   params   =   new   JPEGImageWriteParam(null);  
                  ImageOutputStream   ios   =   ImageIO.createImageOutputStream(resp.getOutputStream());  
                  writer.setOutput(ios);  
                  writer.write(null,   new   IIOImage(image,   null,   null),   params);  
                  writer.dispose();  
                  ios.close();  
          }  
 
          static   String   sn2vcode()    
          {  
                  String   sRand   =   "";  
                  Random   random   =   new   Random();  
                  for   (int   i=0;i<4;i++)  
                  {  
                            String   rand=String.valueOf(random.nextInt(10));  
                            sRand+=rand;  
                  }  
                  return   sRand;  
          }  
 
 
          public   void   init()   throws   ServletException    
          {  
                  try    
                  {  
                            GraphicsEnvironment.getLocalGraphicsEnvironment();  
                  }    
                catch   (Throwable   e)    
                  {  
               
                            svgMode   =   true;  
                  }  
          }  
 
 
          public   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);  
          }  
}  

web.xml中配置servlet
加入以下面两句话

  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>VerifyCodeServlet</servlet-name>
    <servlet-class>pp.function.VerifyCodeServlet</servlet-class>
  </servlet>
<servlet-mapping>
   <servlet-name>VerifyCodeServlet</servlet-name>
    <url-pattern>/VerifyCodeServlet</url-pattern>
  </servlet-mapping>

使用这个彩色验证 这个servlet就是一个随机图片,  /VerifyCodeServlet

login.jsp
<%@ page language="java"  contentType="text/html; charset=GB2312" import="java.sql.*"%>
<jsp:useBean id="db" class="com.pp.db.DBOperation"></jsp:useBean>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head>
  <link rel="stylesheet" type="text/css" href="../css/book.css">
  <title>广告主登陆</title>
  <script language="javascript">
  function IsDigit(cCheck)
  {
   return (('0'<=cCheck) && (cCheck<='9'));
  }
  
  function IsAlpha(cCheck)
  {
   return ((('a'<=cCheck) && (cCheck<='z')) || (('A'<=cCheck) && (cCheck<='Z')))
  }
   
  function IsValid()
  {
   var strUsername = formadv.Username.value;
   for (nIndex=0; nIndex<strUsername.length; nIndex++)
   {
    cCheck = strUsername.charAt(nIndex);  
    if (!(IsDigit(cCheck) || IsAlpha(cCheck)))
    {
     return false;
    }
   } 
   return true;
  }
    function docheck()
  {   
    
           if(formadv.Username.value=="")
   {
    alert("请填写用户名");
    return false;
   }
   else if(!IsValid())
   {
      alert("用户名只能使用字母和数字");
      return false;     
   }
 
   else if(formadv.Password.value=="")
   {
      alert("请填写密码");
      return false;     
   }
     else if(formadv.Rand.value=="")
   {
      alert("请填写验证码");
      return false;     
   }
   else
       {
           
    return true;
   }
  }
  </script>

  </head>
 
  <body>
 
    <form name="formadv" action="../advertiser/login_ad_do.jsp"" method="post" target="_self" onSubmit="return docheck()">
  <TABLE>
<TR>
 <TD>用户名:</TD>
 <TD><INPUT TYPE="text"  NAME="Username" SIZE=15>
 </TD>
 <TD>密码:</TD>
 <TD><INPUT TYPE="password"  NAME="Password" SIZE=15></TD>
 <TD>验证码:</TD>
 <TD><INPUT TYPE="text"  NAME="Rand" SIZE=5> &nbsp;<img border=0 src="../VerifyCodeServlet"></TD>

 <TD><INPUT TYPE="submit"  value="提交" SIZE=15></TD>
 <TD><INPUT TYPE="button"  value="取消" SIZE=15></TD>
</TR>
</TABLE>
  </form>
 
  </body>
</html>

login_ad_do.jsp
<%@ page language="java"  contentType="text/html; charset=GB2312" import="java.sql.*"%>
<jsp:useBean id="db" class="com.pp.db.DBOperation"></jsp:useBean>

<html>
  <head>

  </head>
 
  <body>
<%
  String Username=request.getParameter("Username");
   String Password=request.getParameter("Password");
 String Rand=request.getParameter("Rand");
 String imgRand=(String)session.getAttribute("rand");  
 // System.out.println(Rand);
   if(Rand.equals(imgRand)){
   try{
      db.creatConnection();
       String sql="select * from AdsHost where Username='"+Username+"' and Password='"+Password+"'";
    // String sql="select * from WebSiteHost where UserName='facepp' and Password=911";
       //System.out.println(sql);
   ResultSet rs=db.executeQuery(sql);
   if(rs.next()){
    String id=new Integer(rs.getInt("id")).toString();
    session.setAttribute("Login","Yes");
    session.setAttribute("Username",Username);
    session.setAttribute("ID",id);//edit
   response.sendRedirect("../advertiser/Admin_Main.jsp");
   }
    else{
   // System.out.println("你错了呀");
    }
    //  while(rs.next()){out.println(rs.getString(2));}
     db.closeConnection();
     rs.close(); 
   }
   catch(Exception e){System.out.println(e.toString());}
}
else{
 out.print("你输入的验证码错误!");
 out.println("<input type=button name=btn3 value=返回 onClick='window.history.go(-1)'> ");
}
 
 
 %>
  </body>
</html>

 

抱歉!评论已关闭.