struts2、servlet实现验证码功能

最近的项目要求有验证码,从网上找了一些资料,有些很清楚,但是,那些例子都是用servlet做的,而此时我的项目是用struts框架做的,有点地方需要修改。

这次完成验证码有点小的教训,就像小叶说的,不能依赖性太大,我就是属于那种依赖性比较大的。因此,问了别人后,人家给解释后,后悔了……因为听人家一解释发现,自己也能咂摸过来这个道理呀……不过,还是很感谢csdn小鬼。

好了,言归正传,说说实现功能:

就是验证码的功能,首先,产生验证码是通过servlet实现,然后将生成的验证码放到一个session里面,之后,在jsp页面显示生成的图形,提交后,通过执行action,从session中提取出验证码,与输入的相比较,完成最后的验证。改进之处在于,查到的那些都是用的servlet,但是,我提交后不能用servlet了,要用struts2.

一、首先是servlet生成验证码并存储在session里面:(http://fayaa.com/code/view/8922/full/

Code:
  1. package com.servlet;    
  2. import java.awt.Color;    
  3. import java.awt.Font;    
  4. import java.awt.Graphics;    
  5. import java.awt.image.BufferedImage;    
  6. import java.io.IOException;    
  7. import java.util.Random;    
  8. import javax.imageio.ImageIO;    
  9. import javax.servlet.ServletException;    
  10. import javax.servlet.ServletOutputStream;    
  11. import javax.servlet.http.HttpServlet;    
  12. import javax.servlet.http.HttpServletRequest;    
  13. import javax.servlet.http.HttpServletResponse;    
  14. import javax.servlet.http.HttpSession;    
  15.   
  16. public class ImageServlet extends HttpServlet {    
  17. private static final long serialVersionUID = 1L;    
  18. public void doGet(HttpServletRequest request, HttpServletResponse response)    
  19.    throws ServletException, IOException {    
  20.             doPost(request, response);    
  21. }    
  22. public void doPost(HttpServletRequest request, HttpServletResponse response)    
  23.    throws ServletException, IOException {    
  24.   int width=80;//验证码图片宽度    
  25.   int height=30;//验证码图片高度    
  26.   BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);    
  27.   Graphics g=image.getGraphics();    
  28.   Random random=new Random();//创建一个随机类    
  29.   g.setColor(getRandColor(200,250));//背景颜色要偏淡    
  30.   g.fillRect(00, width, height);//画背景    
  31.   g.setColor(getRandColor(0,255));//边框颜色    
  32.         g.drawRect(00, width-1, height-1);//画边框    
  33.   g.setColor(getRandColor(160,200));// 随机产生5条干扰线,使图象中的认证码不易被其它程序探测到    
  34.   for(int i=0;i<8;i++){    
  35.    int x=random.nextInt(width);    
  36.    int y=random.nextInt(height);    
  37.    int x1=random.nextInt(width);    
  38.    int y1=random.nextInt(height);    
  39.    g.drawLine(x, y, x1, y1);    
  40.   }    
  41.   g.setColor(getRandColor(160,200));// 随机产生100点,使图象中的认证码不易被其它程序探测到    
  42.   for(int i=0;i<100;i++){    
  43.    int x=random.nextInt(width);    
  44.    int y=random.nextInt(height);    
  45.    g.drawLine(x, y, x, y);    
  46.   }    
  47.         Font font = new Font("Times New Roman", Font.ITALIC,26);  // 创建字体,字体的大小应该根据图片的高度来定。    
  48.         g.setFont(font);//设置字体    
  49.         int length = 4;  // 设置默认生成4个验证码    
  50.   String s="abcdefghijklmnopqrstuvwxyz0123456789"// 设置备选验证码:包括"a-z"和数字"0-9"    
  51.   String sRand="";    
  52.         
  53.         // 用随机产生的颜色将验证码绘制到图像中。    
  54.         // 生成随机颜色(因为是做前景,所以偏深)      
  55.         //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成    
  56.         g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));      
  57.   for(int i=0;i<length;i++){    
  58.    String ch=String .valueOf(s.charAt(random.nextInt(s.length())));    
  59.    sRand+=ch;    
  60.    g.drawString(ch, 12*i+12, (random.nextInt(5)-2)*i+20);    
  61.   }    
  62.   //将生成的字符串存储在session中    
  63.   HttpSession session=request.getSession();      
  64.   session.setAttribute("checkCode", sRand);    
  65.   g.dispose();//图像生效    
  66.   //禁止图像缓存    
  67.   response.setHeader("Pragma""No-cache");    
  68.   response.setHeader("Cache-Control""no-cache");    
  69.   response.setDateHeader("Expires"0);      
  70.   response.setContentType("image/jpeg");    
  71.   //创建二进制的输出流    
  72.   ServletOutputStream sos=response.getOutputStream();    
  73.         // 将图像输出到Servlet输出流中。    
  74.         ImageIO.write(image, "jpeg", sos);    
  75.         sos.flush();    
  76.         sos.close();    
  77. }    
  78.   
  79. public Color getRandColor(int lower,int upper){    
  80.   Random random = new Random();    
  81.   if(upper>255)    
  82.    upper=255;    
  83.   if(upper<1)    
  84.    upper=1;    
  85.   if(lower<1)    
  86.    lower=1;    
  87.   if(lower>255)    
  88.    lower=255;    
  89.   int r=lower+random.nextInt(upper-lower);    
  90.   int g=lower+random.nextInt(upper-lower);    
  91.   int b=lower+random.nextInt(upper-lower);    
  92.   return new Color(r,g,b);    
  93. }    
  94. }   

二、在jsp中显示,并添加js实现“看不清”操作

js的定义:

Code:
  1. <script language="javascript">   
  2.      function changeImg(){    
  3.    var a=document.getElementById("mySpan");    
  4.    a.innerHTML='<img align="middle" src="ImageServlet"/>  <a href="#" onclick="changeImg();">看不清</a>'    
  5.   }   

jsp显示:(用到了struts2里面的标签,如果不用的话,直接将“s:”去掉)

Code:
  1. <s:form action="Login.action" name="form1" method="post"> 
  2. <tr><td>  
  3.      <span style="color:black" >Yanzheng: </span>  
  4.  <input type="text" id"verifyCode" name="txtyzm" size="6" />  
  5.   <span id="mySpan"><img align="middle" src="ImageServlet" /><a    
  6.    href="#" onclick="changeImg();">看不清</a> </span>    
  7.    <span style="color:red;"><s:property value="yanzheng"></s:property></span>  
  8. </td>  
  9. </tr>  
  10. <s:/form>

三、struts.xml中的配置:

Code:
  1. <!-- 登录操作 -->  
  2.     <action name="Login" class="com.action.Login" >  
  3.      <result name="userslog">/weluser.jsp</result>  
  4.       <result name="usersout">/index.jsp</result>  
  5.        <result name="ff">/ff.jsp</result>  
  6.      </action>  

四、在Login.java中完成验证码的判断(只显示验证码判断部分)

Code:
  1. public class Login extends ActionSupport{
  2. private String yanzheng; 
  3. public String getYanzheng() {      
  4.         return yanzheng;      
  5.     }      
  6.     public void setYanzheng(String yanzheng) {      
  7.         this.yanzheng = yanzheng;      
  8.     }      
  9.     private String txtyzm = new String();      
  10.     public String getTxtyzm() {      
  11.         return txtyzm;      
  12.     }      
  13.     public void setTxtyzm(String txtyzm) {      
  14.         this.txtyzm = txtyzm;      
  15.     }      
  16.     public String getUstatus() {      
  17.         return ustatus;      
  18.     }      
  19.      
  20. public String execute() throws IOException{
  21. //验证码      
  22.         String validateC = new String ();      
  23.         HttpServletResponse response = null;    
  24. //将session里面的验证码提取出来     
  25.         HttpSession sessions = ServletActionContext.getRequest().getSession();      
  26.         validateC = (String) sessions.getAttribute("checkCode");      
  27.           if (txtyzm.equals(validateC)){      
  28.               yanzheng="";      
  29.            }else{      
  30.                yanzheng="验证码有误";      
  31.                return "usersout";      
  32.            }    
  33. }

这样的话,就可以在jsp页面返回验证码错误信息了。总的来时,产生验证码时用的servlet,验证的时候,放到了struts2框架。

记录一下啦~

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值