`
mengqingyu
  • 浏览: 333030 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

验证码配置方法

阅读更多
1.在web.xml下配置2个servlet,VerifyCodeServlet用来生成验证码图像,
ResultServlet用来做服务器端验证。
	<servlet>
		<servlet-name>VerifyCodeServlet</servlet-name>
		<servlet-class>VerifyCodeServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>ResultServlet</servlet-name>
		<servlet-class>ResultServlet</servlet-class>
	</servlet>
 	<servlet-mapping>
		<servlet-name>VerifyCodeServlet</servlet-name>
		<url-pattern>/verifyCodeServlet</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>ResultServlet</servlet-name>
		<url-pattern>/resultServlet</url-pattern>
	</servlet-mapping>

2.servlet类文件
import java.awt.Color;   
import java.awt.Font;   
import java.awt.Graphics2D;   
import java.awt.image.BufferedImage;   
import java.util.Random;   
  
import javax.imageio.ImageIO;   
import javax.servlet.ServletException;   
import javax.servlet.ServletOutputStream;   
import javax.servlet.http.HttpServlet;   
import javax.servlet.http.HttpServletRequest;   
import javax.servlet.http.HttpServletResponse;   
import javax.servlet.http.HttpSession;   

public class VerifyCodeServlet extends HttpServlet {   
  
    
    /**
    * 验证码图片的宽度。 
    */
    private int width = 70;   
    
    /**
    *  验证码图片的高度。
    */
    private int height = 20;   
  
 
    /**
    * 验证码字符个数 
    */
    private int codeCount = 4;   
  
    /**
    * xx
    */
    private int xx = 0;   
  
    /**
    * 字体高度   
    */
    private int fontHeight;   
  
    /**
    * codeY
    */
    private int codeY;   
  
    /**
    * codeSequence
    */
    char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',   
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',   
            'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };   
  
    /**  
     * 初始化验证图片属性  
     */  
    public void init() throws ServletException {   
        // 从web.xml中获取初始信息   
        // 宽度   
        String strWidth = this.getInitParameter("width");   
        // 高度   
        String strHeight = this.getInitParameter("height");   
        // 字符个数   
        String strCodeCount = this.getInitParameter("codeCount");   
  
        // 将配置的信息转换成数值   
        try {   
            if (strWidth != null && strWidth.length() != 0) {   
                width = Integer.parseInt(strWidth);   
            }   
            if (strHeight != null && strHeight.length() != 0) {   
                height = Integer.parseInt(strHeight);   
            }   
            if (strCodeCount != null && strCodeCount.length() != 0) {   
                codeCount = Integer.parseInt(strCodeCount);   
            }   
        } catch (NumberFormatException e) {
         e.printStackTrace();
        }   
  
        xx = width / (codeCount + 1);   
        fontHeight = height - 2;   
        codeY = height - 4;   
  
    }   
  
    /**
    * @param req
    * @param resp
    * @throws ServletException
    * @throws java.io.IOException
    */
    protected void service(HttpServletRequest req, HttpServletResponse resp)   
            throws ServletException, java.io.IOException {   
  
        // 定义图像buffer   
        BufferedImage buffImg = new BufferedImage(width, height,   
                BufferedImage.TYPE_INT_RGB);   
        Graphics2D gd = buffImg.createGraphics();   
  
        // 创建一个随机数生成器类   
        Random random = new Random();   
  
        // 将图像填充为白色   
        gd.setColor(Color.WHITE);   
        gd.fillRect(0, 0, width, height);   
  
        // 创建字体,字体的大小应该根据图片的高度来定。   
        Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);   
        // 设置字体。   
        gd.setFont(font);   
  
        // 画边框。   
        gd.setColor(Color.BLACK);   
        gd.drawRect(0, 0, width - 1, height - 1);   
  
        // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
        
        gd.setColor(Color.lightGray);   
        for (int i = 0; i < 16; i++) {   
            int x = random.nextInt(width);   
            int y = random.nextInt(height);   
            int xl = random.nextInt(12);   
            int yl = random.nextInt(12);   
            gd.drawLine(x, y, x + xl, y + yl);   
        }   
  
        // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。   
        StringBuffer randomCode = new StringBuffer();   
        int red = 0, green = 0, blue = 0;   
  
        // 随机产生codeCount数字的验证码。   
        for (int i = 0; i < codeCount; i++) {   
            // 得到随机产生的验证码数字。   
            String strRand = String.valueOf(codeSequence[random.nextInt(36)]);   
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。   
            red = random.nextInt(255);   
            green = random.nextInt(255);   
            blue = random.nextInt(255);   
  
            // 用随机产生的颜色将验证码绘制到图像中。   
            gd.setColor(new Color(red, green, blue));   
            gd.drawString(strRand, (i + 1) * xx, codeY);   
  
            // 将产生的四个随机数组合在一起。   
            randomCode.append(strRand);   
        }   
        // 将四位数字的验证码保存到Session中。   
        HttpSession session = req.getSession();   
        session.setAttribute("validateCode", randomCode.toString());   
  
        // 禁止图像缓存。   
        resp.setHeader("Pragma", "no-cache");   
        resp.setHeader("Cache-Control", "no-cache");   
        resp.setDateHeader("Expires", 0);   
  
        resp.setContentType("image/jpeg");   
  
        // 将图像输出到Servlet输出流中。   
        ServletOutputStream sos = resp.getOutputStream();   
        ImageIO.write(buffImg, "jpeg", sos);   
        sos.close();   
    }   
  
} 


import java.io.IOException;   
import java.io.PrintWriter;   
  
import javax.servlet.ServletException;   
import javax.servlet.http.HttpServlet;   
import javax.servlet.http.HttpServletRequest;   
import javax.servlet.http.HttpServletResponse;   
  
public class ResultServlet extends HttpServlet {   
  
    public void doGet(HttpServletRequest request, HttpServletResponse response)   
            throws ServletException, IOException {   
  
        doPost(request, response);   
    }   
  
    public void doPost(HttpServletRequest request, HttpServletResponse response)   
            throws ServletException, IOException {   
  
        response.setContentType("text/html;charset=utf-8");   
        String validateC = (String) request.getSession().getAttribute("validateCode");   
        String veryCode = request.getParameter("code");   
        PrintWriter out = response.getWriter();         
        veryCode = veryCode.toUpperCase();
        if(veryCode==null||"".equals(veryCode)){   
        	out.print("false");
        }else{   
            if(validateC.equals(veryCode)){   
            	out.print("true");
            }else{   
            	out.print("false");
            }   
        }   
        out.flush();   
        out.close();   
    }   
  
}  

3.jsp页面显示
<input type="text" id="checkCode" name="checkCode" class="s_td"/><img id="imgObj" alt="" src="<c:url value='/verifyCodeServlet'/>" style="vertical-align:top;margin-top:1px;margin-left:5px;"/>&nbsp;&nbsp;  
			        <a href="javascript:void(0);" onclick="changeImg();return false;">看不清,换一张</a> <span id="error"></span> 

4.ajax验证
		//------改变验证码内容------		
		function changeImg(){   
		    var imgSrc = $("#imgObj");   
		  	imgSrc.attr("src",chgUrl("<c:url value='/verifyCodeServlet'/>")); 
		  	$("#checkCode").focus();  
		}	
		//时间戳   
		//为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳   
		function chgUrl(url){   
		    var timestamp = (new Date()).valueOf();   
		    if((url.indexOf("&")>=0)){   
		        url = url + "&tamp=" + timestamp;   
		    }else{   
		        url = url + "?timestamp=" + timestamp;   
		    }   
		    return url;   
		}
		//判断输入的验证码是否正确
		function isRightCode(){   
		    var res = "false";
		    var code = $("#checkCode").attr("value");   
		    code = "data="+new Date()+"&code=" + code; 
		    $.ajax({
		        type:"POST",   
		        url:"<c:url value='/resultServlet'/>",   
		        data:code,   
		        //同步
		        async:false,
		        success:function(data){
		        res=data;
		        }
		    });
		    return res;
		}
分享到:
评论

相关推荐

    java验证码配置

    ### Java验证码配置详解 #### 一、什么是验证码及其作用 验证码是一种用来区分用户是人类还是自动程序的方法。在很多网站和服务中,为了防止恶意登录、批量注册或是其他自动化操作,通常会采用验证码来确保交互的...

    ASP.NET轻松实现验证码3种方法

    2. **前端集成**:在页面中嵌入第三方验证码组件,并按照文档要求进行配置。 3. **后端验证**:用户提交表单时,将验证码响应发送至服务器进行验证。 4. **兼容性和用户体验**:确保第三方服务在各种浏览器和设备上...

    thinkPHP3.1验证码的简单实现方法

    `Image::buildImageVerify()`方法接受两个参数,第一个参数是配置数组,用于设置验证码的样式,如长度、字体、颜色等;第二个参数是保存验证码的session名称。例如,你可以设置验证码长度为4位,字体大小为20像素: ...

    三种方法实现验证码

    2. 在方法中生成随机验证码,可以是纯数字、字母或它们的组合。 3. 将生成的验证码保存在Session中,以便后续验证。 4. 使用Graphics2D绘制验证码到BufferedImage对象上,生成验证码图片。 5. 将BufferedImage转换为...

    识别2种验证码的方法

    在识别验证码的过程中,通常会采用以下两种方法: 1. 人工识别: 这是最原始但有效的方式,特别是对于那些复杂或难以自动解析的验证码。网站可能会提供一个“无法阅读”选项,让用户请求一个新的验证码。这种方式...

    验证码+配置文件+jsp页面调用

    通过这个例子,你可以理解验证码的工作原理,学习如何设置验证码的样式,并掌握在JSP中生成和验证验证码的基本方法。在实际开发中,可以根据项目需求进行适当的优化和扩展,比如使用更复杂的验证码类型,提高安全性...

    去掉UCenter验证码的修改方法

    去掉UCenter验证码的修改方法,是一项针对特定环境配置下出现的验证码显示异常问题的解决方案,主要适用于使用国外虚拟主机的用户遇到的验证码显示为“CCCC”或无法正常通过验证的情况。这一修改涉及到UCenter系统中...

    验证码不能显示解决方法

    但有时可能会遇到验证码无法正常显示的问题,这通常与浏览器设置、系统配置或某些特定的文件关联问题有关。本文将详细介绍一种可能的解决方案——通过修改注册表来解决验证码无法显示的问题。 ### 修改注册表以解决...

    silverlight 实现验证码的3种方法

    2. **配置和生成**:按照库的文档设置验证码的样式,如长度、字体、颜色等,然后调用生成方法。 3. **显示和验证**:将生成的验证码显示在Silverlight应用中,处理用户输入并与服务器端的验证码进行比较。 在实际...

    测试中去掉登录验证码

    3. **配置调整**:有些系统允许在配置文件中开启或关闭验证码功能。查找相关配置项,如`application.properties`或`yaml`文件,临时禁用验证码服务。 4. **接口绕过**:如果验证码是通过API接口获取和验证的,可以...

    好用的php验证码类库.zip

    在"好用的php验证码类"中,这些配置可能通过构造函数参数或设置方法来调整。 7. **易用性**:好的验证码类库应提供简单直观的API,使得开发者能够快速集成到自己的项目中。例如,可能只有一个简单的`output()`方法...

    验证码控件 C#验证码控件

    在实际应用中,C#验证码控件的使用方法通常包括以下几个步骤: 1. **导入库**:首先,在项目中引入验证码控件的库,这可能是通过NuGet包管理器或者其他依赖项管理工具完成的。 2. **添加控件**:在需要使用验证码...

    Android拆轮子系列之写验证码控件的方法

    在CheckView中,我们实现了OnClickListener接口,并在onClick()方法中更新验证码内容。 以下是一段简化的示例代码片段,展示了如何在onDraw()方法中绘制线条和数字: ```java @Override protected void onDraw...

    验证码 spring + dwr

    2. **Spring Bean配置**:创建一个名为`CaptchaService`的Bean,其中包含生成验证码图片和验证验证码的方法。这些方法可以通过注解如`@Autowired`和`@Service`进行配置。 3. **DWR配置**:在`dwr.xml`配置文件中,...

    spring-gateway实现登录验证码校验的代码,百分百可用

    Kaptcha 是一个 Java 实现的验证码生成器,它可以生成包含字母和数字的复杂图片,并具有可配置的样式和扭曲程度,从而增加破解的难度。 首先,我们需要在项目中引入 Kaptcha 的依赖。在 Maven 或 Gradle 的配置文件...

    SSM实现登录验证码功能

    - 创建一个Servlet或Controller方法,返回一个包含验证码图像的HTTP响应。这个图像可以使用`Graphics2D` API动态生成,包括扭曲、倾斜、加噪等处理,使得机器难以识别。 - 在HTML登录页面上添加一个img标签,其src...

    jmeter识别图片验证码的包

    总结来说,这个压缩包提供的是一种利用OCR技术在JMeter中识别图片验证码的方法,尽管存在识别率不高的问题,但通过合理配置和优化,依然可以在一定程度上提升自动化测试的效率。实际应用时,需要根据具体需求和...

    java发送手机短信验证码

    Java发送手机短信验证码是移动应用或网站验证用户身份的常用方法。通过这种方式,可以确保用户是真实的,并且有助于防止欺诈行为。在这个简单的示例中,我们将会探讨如何在Java环境中实现这一功能。 首先,我们需要...

    验证码反爬-超级鹰打码平台-验证码点选、验证码滑动资源

    在网络安全和反爬虫技术领域,验证码是一种常用的方法,用于防止自动化的机器人程序对网站进行恶意操作,如数据抓取或滥用服务。本资源包针对验证码反爬提供了相关的工具和资料,主要涉及到“超级鹰打码平台”以及...

Global site tag (gtag.js) - Google Analytics