servlet彩色验证码

用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>

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现验证码功能的主要思路是在用户注册或登录时生成一个随机的验证码图片,并将验证码保存在session中。当用户提交表单时,将用户输入的验证码与session中保存的验证码进行比对,如果一致则继续执行,否则提示用户输入错误。 以下是一个使用IDEA和Servlet实现验证码功能的示例代码。 1. 首先,在web.xml中配置servletservlet-mapping: ```xml <servlet> <servlet-name>VerifyCodeServlet</servlet-name> <servlet-class>com.example.VerifyCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>VerifyCodeServlet</servlet-name> <url-pattern>/verifyCode</url-pattern> </servlet-mapping> ``` 2. 创建一个名为VerifyCodeServletservlet类,实现doGet方法: ```java package com.example; 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; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; @WebServlet("/verifyCode") public class VerifyCodeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int width = 100; int height = 30; //创建一个图像缓冲区 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获取Graphics2D Graphics2D g2 = (Graphics2D) image.getGraphics(); //设置背景色 g2.setColor(Color.WHITE); g2.fillRect(0, 0, width, height); //设置字体 g2.setFont(new Font("宋体", Font.BOLD, 20)); //生成随机字符 String verifyCode = generateVerifyCode(); //将验证码保存在session中 HttpSession session = request.getSession(); session.setAttribute("verifyCode", verifyCode); //绘制验证码 Random random = new Random(); for (int i = 0; i < verifyCode.length(); i++) { g2.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); g2.drawString(String.valueOf(verifyCode.charAt(i)), i * 20 + 10, 20); } //加入干扰线 for (int i = 0; i < 5; i++) { g2.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); g2.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } //输出图像到页面 response.setContentType("image/jpeg"); ImageIO.write(image, "jpeg", response.getOutputStream()); } /** * 生成随机验证码 * * @return */ private String generateVerifyCode() { String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; StringBuilder sb = new StringBuilder(); Random random = new Random(); for (int i = 0; i < 4; i++) { sb.append(chars.charAt(random.nextInt(chars.length()))); } return sb.toString(); } } ``` 3. 在用户注册或登录页面中添加验证码图片和输入框: ```html <form action="login" method="post"> <div> <label for="username">用户名:</label> <input type="text" name="username" id="username"> </div> <div> <label for="password">密码:</label> <input type="password" name="password" id="password"> </div> <div> <label for="verifyCode">验证码:</label> <input type="text" name="verifyCode" id="verifyCode"> <img src="verifyCode" alt="验证码"> </div> <div> <input type="submit" value="登录"> </div> </form> ``` 4. 在用户登录或注册时验证验证码是否正确: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取用户输入的验证码 String verifyCode = request.getParameter("verifyCode"); //获取session中保存的验证码 HttpSession session = request.getSession(); String sessionVerifyCode = (String) session.getAttribute("verifyCode"); //比对验证码 if (verifyCode.equalsIgnoreCase(sessionVerifyCode)) { //验证码正确,继续执行 } else { //验证码错误,提示用户 } } ``` 以上就是用IDEA和Servlet实现验证码功能的示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值