`

jsp、struts 生成验证码

    博客分类:
  • jsp
阅读更多

一、servlet实现验证码的生成:

第一步:

web.xml配置

01.<servlet>      
02.    <servlet-name>image</servlet-name>      
03.    <servlet-class>org.test.web.AuthImage</servlet-class>      
04.</servlet>      
05.     
06.<servlet-mapping>      
07.    <servlet-name>image</servlet-name>      
08. <url-pattern>/authImage</url-pattern>      
09.</servlet-mapping>    

 第二步:

servlet配置:

01.public class AuthImage extends HttpServlet      
02.{      
03.     
04.    private static final String CONTENT_TYPE = "text/html; charset=gb2312";      
05.    //设置字母的大小,大小      
06.    private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);      
07.    public void init() throws ServletException      
08.    {      
09.        super.init();      
10.    }      
11.    Color getRandColor(int fc,int bc)      
12.    {      
13.        Random random = new Random();      
14.        if(fc>255) fc=255;      
15.        if(bc>255) bc=255;      
16.        int r=fc+random.nextInt(bc-fc);      
17.        int g=fc+random.nextInt(bc-fc);      
18.        int b=fc+random.nextInt(bc-fc);      
19.        return new Color(r,g,b);      
20.    }      
21.     
22.    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException      
23.    {      
24.        response.setHeader("Pragma","No-cache");      
25.        response.setHeader("Cache-Control","no-cache");      
26.        response.setDateHeader("Expires", 0);      
27.        //表明生成的响应是图片      
28.        response.setContentType("image/jpeg");      
29.              
30.        int width=100, height=18;      
31.        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);      
32.              
33.        Graphics g = image.getGraphics();      
34.        Random random = new Random();      
35.        g.setColor(getRandColor(200,250));      
36.        g.fillRect(1, 1, width-1, height-1);      
37.        g.setColor(new Color(102,102,102));      
38.        g.drawRect(0, 0, width-1, height-1);      
39.        g.setFont(mFont);      
40.     
41.        g.setColor(getRandColor(160,200));      
42.     
43.        //画随机线      
44.        for (int i=0;i<155;i++)      
45.        {      
46.            int x = random.nextInt(width - 1);      
47.            int y = random.nextInt(height - 1);      
48.            int xl = random.nextInt(6) + 1;      
49.            int yl = random.nextInt(12) + 1;      
50.            g.drawLine(x,y,x + xl,y + yl);      
51.        }      
52.     
53.        //从另一方向画随机线      
54.        for (int i = 0;i < 70;i++)      
55.        {      
56.            int x = random.nextInt(width - 1);      
57.            int y = random.nextInt(height - 1);      
58.            int xl = random.nextInt(12) + 1;      
59.            int yl = random.nextInt(6) + 1;      
60.            g.drawLine(x,y,x - xl,y - yl);      
61.        }      
62.     
63.        //生成随机数,并将随机数字转换为字母      
64.        String sRand="";      
65.        for (int i=0;i<6;i++)      
66.        {      
67.            int itmp = random.nextInt(26) + 65;      
68.            char ctmp = (char)itmp;      
69.            sRand += String.valueOf(ctmp);      
70.            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));      
71.            g.drawString(String.valueOf(ctmp),15*i+10,16);      
72.        }      
73.     
74.        HttpSession session = request.getSession(true);      
75.        session.setAttribute("rand",sRand);      
76.        g.dispose();      
77.        ImageIO.write(image, "JPEG", response.getOutputStream());      
78.    }      
79.    public void destroy()      
80.    {      
81.    }      
82.}    

 第三步:

页面访问:

01.<img src="authImage"/>   

  二、纯jsp实现验证码的生产

第一步:

jsp代码:

01.<%@ page language="java" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"    
02.     contentType="image/jpeg" pageEncoding="UTF-8"%>   
03.  
04.  
05.<%  //设置页面不缓存   
06.   response.setHeader("Pragma","No-cache");   
07.   response.setHeader("Cahce-Control","no-cache");   
08.   response.setDateHeader("Expires",0);   
09.   //在内存中创建图片   
10.   int width=60,height=20;   
11.   BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);   
12.   //获取图形上下文   
13.   Graphics g= image.getGraphics();   
14.   //生成随机类   
15.   Random random= new Random();   
16.   //设置背景颜色   
17.   g.setColor(new Color(160,200,100));   
18.   g.fillRect(0,0,width,height);   
19.   //设置字体   
20.   g.setFont(new Font("Times New Roman",Font.PLAIN,18));   
21.   //随机产生50条干扰线,使图形中的验证码不易被其他的程序探测到   
22.    g.setColor(new Color(160,200,200));   
23.   for(int i=0;i<50;i++)   
24.   {   
25.     int x=random.nextInt(width);   
26.     int y=random.nextInt(height);   
27.     int x1=random.nextInt(width);   
28.     int y1=random.nextInt(height);   
29.     g.drawLine(x,y,x+x1,y+y1);   
30.   }   
31.   //随机产生验证码(6位数字)   
32.   String sRand="";   
33.   for(int i=0;i<6;i++)   
34.   {   
35.     String rand=String.valueOf(random.nextInt(10));   
36.     sRand+=rand;   
37.     //将验证码显示到图象   
38.     g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));   
39.     g.drawString(rand,13*i+6,16);   
40.   }   
41.   session.setAttribute("rand",sRand);  //////将产生的验证码存储到sesson中   
42.   g.dispose();   
43.   ImageIO.write(image,"JPEG",response.getOutputStream());   
44.   out.clear(); //***********   
45.   out=pageContext.pushBody();//**********   
46. %>    

第二步:

页面访问:

01.<img src="xxx.jsp"/>   

 三、struts实现验证码生成:

第一步:

工具类RandomNumUtil 代码:

01.package com.cn.hospital.util;   
02.  
03.import java.awt.Color;      
04.import java.awt.Font;      
05.import java.awt.Graphics;      
06.import java.awt.image.BufferedImage;      
07.import java.io.ByteArrayInputStream;      
08.import java.io.ByteArrayOutputStream;      
09.import java.util.Random;      
10.import javax.imageio.ImageIO;      
11.import javax.imageio.stream.ImageOutputStream;      
12.  
13.public class RandomNumUtil {   
14.  
15.    private ByteArrayInputStream image;//图像       
16.    private String str;//验证码       
17.         
18.    private RandomNumUtil(){       
19.    init();//初始化属性       
20.    }       
21.    /*     
22.    * 取得RandomNumUtil实例     
23.    */       
24.    public static RandomNumUtil Instance(){       
25.    return new RandomNumUtil();       
26.    }       
27.    /*     
28.    * 取得验证码图片     
29.    */       
30.    public ByteArrayInputStream getImage(){       
31.    return this.image;       
32.    }       
33.    /*     
34.    * 取得图片的验证码     
35.    */       
36.    public String getString(){       
37.    return this.str;       
38.    }       
39.         
40.    private void init() {       
41.    // 在内存中创建图象       
42.    int width=85, height=20;       
43.    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);       
44.    // 获取图形上下文       
45.    Graphics g = image.getGraphics();       
46.    // 生成随机类       
47.    Random random = new Random();       
48.    // 设定背景色       
49.    g.setColor(getRandColor(200,250));       
50.    g.fillRect(0, 0, width, height);       
51.    // 设定字体       
52.    g.setFont(new Font("Times New Roman",Font.PLAIN,18));       
53.    // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到       
54.    g.setColor(getRandColor(160,200));       
55.    for (int i=0;i<155;i++)       
56.    {       
57.    int x = random.nextInt(width);       
58.    int y = random.nextInt(height);       
59.    int xl = random.nextInt(12);       
60.    int yl = random.nextInt(12);       
61.    g.drawLine(x,y,x+xl,y+yl);       
62.    }       
63.    // 取随机产生的认证码(6位数字)       
64.    String sRand="";       
65.    for (int i=0;i<6;i++){       
66.    String rand=String.valueOf(random.nextInt(10));       
67.    sRand+=rand;       
68.    // 将认证码显示到图象中       
69.    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));       
70.    // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成       
71.    g.drawString(rand,13*i+6,16);       
72.    }      
73.    //赋值验证码      
74.    this.str=sRand;       
75.         
76.    //图象生效       
77.    g.dispose();       
78.    ByteArrayInputStream input=null;       
79.    ByteArrayOutputStream output = new ByteArrayOutputStream();       
80.    try{       
81.    ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);       
82.    ImageIO.write(image, "JPEG", imageOut);       
83.    imageOut.close();       
84.    input = new ByteArrayInputStream(output.toByteArray());       
85.    }catch(Exception e){       
86.    System.out.println("验证码图片产生出现错误:"+e.toString());       
87.    }       
88.         
89.    this.image=input;/* 赋值图像 */       
90.    }       
91.    /*     
92.    * 给定范围获得随机颜色     
93.    */       
94.    private Color getRandColor(int fc,int bc){       
95.    Random random = new Random();       
96.    if(fc>255) fc=255;       
97.    if(bc>255) bc=255;       
98.    int r=fc+random.nextInt(bc-fc);       
99.    int g=fc+random.nextInt(bc-fc);       
100.    int b=fc+random.nextInt(bc-fc);       
101.    return new Color(r,g,b);       
102.    }      
103.} 

  第二步:

验证码输出action

01.package com.cn.hospital.action; 
02. 
03.import java.io.ByteArrayInputStream; 
04.import java.io.ByteArrayOutputStream; 
05. 
06.import org.springframework.context.annotation.Scope; 
07.import org.springframework.stereotype.Controller; 
08. 
09.import com.cn.hospital.util.RandomCharUtil; 
10.import com.cn.hospital.util.RandomNumUtil; 
11.import com.opensymphony.xwork2.ActionContext; 
12.import com.opensymphony.xwork2.ActionSupport; 
13. 
14.@Controller("utilAction") 
15.@Scope("prototype") 
16.public class UtilAction extends ActionSupport{ 
17. 
18. private static final long serialVersionUID = -7193209177116825032L; 
19. private ByteArrayInputStream inputStream; 
20. 
21. private int width; 
22. private int height; 
23. private int fontSize; 
24. private int codeLength; 
25. private int disturbType; 
26. 
27. public String validNumGenerate() throws Exception{ 
28. RandomNumUtil rdnu=RandomNumUtil.Instance(); 
29. this.setInputStream(rdnu.getImage());//取得带有随机字符串的图片 
30. ActionContext.getContext().getSession().put("random", rdnu.getString());//取得随机字符串放入HttpSession 
31. return SUCCESS; 
32. } 
33. 
34. 
35. public void setInputStream(ByteArrayInputStream inputStream) { 
36. this.inputStream = inputStream; 
37. } 
38. 
39. public ByteArrayInputStream getInputStream() { 
40. return inputStream; 
41. } 
42. 
43. 
44.} 

 

 

 第三步:

struts.xml配置

01.<!-- 产生随机验证码 -->   
02.        <action name="randNum" class="utilAction" method="validNumGenerate">         
03.           <result name="success" type="stream">         
04.                <param name="contentType">image/jpeg</param>         
05.                <param name="inputName">inputStream</param>         
06.           </result>      
07.        </action>    

第四步:

页面访问:

01.<img src="randNum"/>   

 

分享到:
评论

相关推荐

    JSP自动生成彩色验证码

    彩色验证码的实现是在生成验证码的基础上增加了颜色元素,使得验证码更难以被自动化工具识别,增强了安全性。 JSP是一种基于Java的服务器端脚本语言,用于创建动态网页。在本项目中,`code.jsp`是核心页面,它负责...

    Struts2的验证码生成

    2. **配置Struts2**:在Struts2的配置文件(struts.xml)中,我们需要定义一个Action,这个Action将负责生成验证码。Action应该有一个结果类型,指向一个JSP页面或者FreeMarker模板,用于显示验证码图片。 3. **...

    struts2生成中文验证码的Action

    这个类将包含生成验证码的方法,以及处理用户提交验证的逻辑。 3. **生成中文验证码**: 验证码生成通常涉及随机选择汉字并组合。你可以使用Java的`Random`类和预先准备的汉字字符数组来生成随机的中文字符串。确保...

    最新的struts2验证码.rar

    在Struts2中,可以使用Java的Random类或其他库(如Apache Commons Lang的RandomStringUtils)来生成验证码的内容,然后将其存储在Session中以便后续验证。 2. **视图展示**:验证码需要显示在用户界面上,这可以...

    基于struts2的验证码生成

    6. **JSP页面**:前端展示部分,包括生成验证码的图片和输入框,以及提交验证的按钮。使用Ajax技术与后台进行交互,实现实时刷新和验证功能。 7. **安全注意事项**:在实现过程中,要考虑到安全性问题,比如防止...

    一个简单的struts2验证码

    总之,"一个简单的Struts2验证码"涉及到的是在Struts2框架下实现验证码功能的全过程,涵盖了从生成验证码到用户验证的各个步骤。理解并掌握这个过程对于提升web应用的安全性和防止自动化攻击至关重要。

    基于struts1.x的验证码实现

    例如,你可能会有一个名为`GenerateCaptchaAction`的类,负责生成验证码,并将其存入session,然后在`login.jsp`这样的页面中,通过`&lt;s:property&gt;`标签来显示验证码图片。 此外,为了提高验证码的安全性,可以考虑...

    struts2-生成图片验证码

    "struts2-生成图片验证码"的主题表明我们将探讨如何在Struts2框架中实现图片验证码的功能。 验证码通常由随机生成的一串字符组成,这些字符以图像形式显示,用户需要输入他们看到的字符以完成验证。在Struts2中实现...

    用struts实现验证码.rar

    在JSP页面上,你需要添加一个img标签来显示生成的验证码图像。图像的src属性应指向之前定义的Action。 5. **表单验证**: 用户填写表单并提交时,Struts的验证机制会检查用户输入的验证码是否与session中存储的值...

    struts2验证码.pdf

    综上所述,Struts2验证码的实现利用了Java AWT库来生成内存中的图片,结合Struts2框架的流结果类型,实现了动态生成并返回验证码的功能。这种技术提高了网站安全性,防止了自动化脚本的恶意操作,同时通过JavaScript...

    jsp用户登录验证码

    1. **生成验证码**: - 定义验证码的宽度和高度。 - 使用`RandomStringUtils.random`方法生成随机字符串。 - 将生成的随机字符串存储到`HttpSession`中。 2. **绘制验证码图片**: - 创建一个`BufferedImage`...

    struts2验证码

    3. **结果类型(Result)**:生成验证码后,需要将生成的图像返回给客户端。你可以配置一个特定的结果类型,如“stream”,用于输出图像流到HTTP响应中。 4. **JSP/FreeMarker模板**:前端页面上需要有一个表单让...

    struts2实现验证码

    1. **生成验证码**:创建一个Java类,用于生成随机的字符串或数字。这个类可能包含一个方法,返回一个指定长度的字符串,例如包含4位数字。我们可以使用Java的`Random`类和`StringBuilder`类来实现这一功能。 2. **...

    java登录验证码生成代码

    一个登录验证生成验证码用struts 后台生成验证码在jsp页面输出生成图片

    struts2+spring3验证码登录实例

    在这个目录下,你会找到Action类、Service类、DAO(数据访问对象)类、配置文件如struts.xml、spring-servlet.xml、web.xml,以及用于生成和验证验证码的类或组件。例如,验证码可能通过Servlet生成并存储在Session...

    struts验证码

    在这个案例中,Action负责处理与验证码相关的请求,可能包括生成验证码、验证用户输入的验证码以及处理相关的业务逻辑。 2. **JSP**:Java Server Pages是用于动态生成HTML、XML或其他类型的Web内容的Java技术。在...

    STRUTS2验证码

    在这个Struts2的项目案例中,开发者已经创建了一个完整的流程,包括生成验证码的逻辑以及将其整合到Struts2框架中的方法。 验证码的生成通常包含以下几个步骤: 1. **随机生成数字或字母**:验证码通常由随机选择...

    成功的验证码案例-----struts验证码demo

    - **生成验证码页面**:可能名为`generateVerifyCode.jsp`,它调用Action生成验证码并显示在图像上。通常,这个页面会通过JavaScript设置一个隐藏字段来存储验证码的值,以便在后续提交时验证。 - **显示表单页面*...

    使用struts2.0实现的验证码功能

    Action可能包含一个方法,该方法生成验证码并将其设置到Session中。 - 同时,还需要配置一个结果(Result)类型,比如`stream`,用于将生成的验证码图片直接输出到浏览器。 3. **JSP页面**: - 登录页面的HTML或...

Global site tag (gtag.js) - Google Analytics