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

struts2 实现图片验证码(一)

2018年05月28日 ⁄ 综合 ⁄ 共 3291字 ⁄ 字号 评论关闭

今天在struts2下实现了图片验证码的实例,基本思想如下:

1.实现产生图片验证码的action(其实产生图片的过程不应该在action里,这里为了方便全写在action里了)。

Action代码  收藏代码
  1. public class RandomAction extends ActionSupport{  
  2.     private ByteArrayInputStream inputStream;  
  3.     public String execute() throws Exception{  
  4. //       在内存中创建图象  
  5.         int width=85, height=20;  
  6.         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
  7. //       获取图形上下文  
  8.         Graphics g = image.getGraphics();  
  9. //      生成随机类  
  10.         Random random = new Random();  
  11. //       设定背景色  
  12.         g.setColor(getRandColor(200,250));  
  13.         g.fillRect(00, width, height);  
  14. //      设定字体  
  15.         g.setFont(new Font("Times New Roman",Font.PLAIN,18));  
  16. //       随机产生155条干扰线,使图象中的认证码不易被其它程序探测到  
  17.         g.setColor(getRandColor(160,200));  
  18.         for (int i=0;i<155;i++)  
  19.         {  
  20.          int x = random.nextInt(width);  
  21.          int y = random.nextInt(height);  
  22.                 int xl = random.nextInt(12);  
  23.                 int yl = random.nextInt(12);  
  24.          g.drawLine(x,y,x+xl,y+yl);  
  25.         }  
  26. //       取随机产生的认证码(6位数字)  
  27.         String sRand="";  
  28.         for (int i=0;i<6;i++){  
  29.             String rand=String.valueOf(random.nextInt(10));  
  30.             sRand+=rand;  
  31.             // 将认证码显示到图象中  
  32.             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));  
  33. //      调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成  
  34.             g.drawString(rand,13*i+6,16);  
  35.         }  
  36. //       将认证码存入SESSION  
  37.         ActionContext.getContext().getSession().put("rand",sRand);  
  38. //       图象生效  
  39.         g.dispose();  
  40.         ByteArrayOutputStream output = new ByteArrayOutputStream();  
  41.         ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);  
  42.         ImageIO.write(image, "JPEG", imageOut);  
  43.         imageOut.close();  
  44.         ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());  
  45.         this.setInputStream(input);  
  46.         return SUCCESS;  
  47.     }  
  48.     /*  
  49.      * 给定范围获得随机颜色  
  50.      */  
  51.     private Color getRandColor(int fc,int bc){  
  52.         Random random = new Random();  
  53.         if(fc>255) fc=255;  
  54.         if(bc>255) bc=255;  
  55.         int r=fc+random.nextInt(bc-fc);  
  56.         int g=fc+random.nextInt(bc-fc);  
  57.         int b=fc+random.nextInt(bc-fc);  
  58.         return new Color(r,g,b);  
  59.    }  
  60.     public void setInputStream(ByteArrayInputStream inputStream) {  
  61.         this.inputStream = inputStream;  
  62.     }  
  63.     public ByteArrayInputStream getInputStream() {  
  64.         return inputStream;  
  65.     }  
  66.   
  67. }  

 2.配置action,将上述action返回的逻辑结果设置为文件流类型。

Struts.xml代码  收藏代码
  1. <action name="rand" class="test.RandomAction">  
  2.       <result type="stream">  
  3.                <param name="contentType">image/jpeg</param>  
  4.                <param name="inputName">inputStream</param>  
  5.         </result>  
  6.  </action>  

 3.写一个测试的html页面,使其请求上面的action,得到返回的图片结果。

显示图片验证码的html页代码  收藏代码
  1. <head>
  2.  <script type="text/javascript">  
  3.     function changeValidateCode(obj) {  
  4.            //获取当前的时间作为参数,无具体意义  
  5.         var timenow = new Date().getTime();  
  6.            //每次请求需要一个不同的参数,否则可能会返回同样的验证码  
  7.         //这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。  
  8.         obj.src="rand.action?d="+timenow;  
  9.     }  
  10. </script>  

  11. </head>
  12. <body>
  13.      <img src="rand.action" onclick="changeValidateCode(this)"/>  
  14. </body>

 

 现在可以看一下运行结果,点击图片可以改变验证码。如下图所示(当然,下面的图是不可以点的,是让你点自己运行后的程序)



  • 大小: 1.4 KB

抱歉!评论已关闭.