`

Action验证码误区

阅读更多
Action图形验证码,代码来自互联网。
public String execute() throws Exception {
		 try {   
		        int width = 50;   
		        int height = 18;   
		        // 取得一个4位随机字母数字字符串   
		        String s = RandomStringUtils.random(4, true, true);   
		        // 保存入session,用于与用户的输入进行比较.   
		        // 注意比较完之后清除session.   
		        ActionContext.getContext().getSession().put("validateCode", s);   
		        response.setContentType("images/jpeg");   
		        response.setHeader("Pragma", "No-cache");   
		        response.setHeader("Cache-Control", "no-cache");   
		        response.setDateHeader("Expires", 0);   
		        ServletOutputStream out = response.getOutputStream();   
		        BufferedImage image = new BufferedImage(width, height,   
		            BufferedImage.TYPE_INT_RGB);   
		        Graphics g = image.getGraphics();   
		        // 设定背景色   
		        g.setColor(getRandColor(200, 250));   
		        g.fillRect(0, 0, width, height);   
		        // 设定字体   
		        Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 设置字体   
		        g.setFont(mFont);   
		        // 画边框   
		        // g.setColor(Color.BLACK);   
		        // g.drawRect(0, 0, width - 1, height - 1);   
		        // 随机产生干扰线,使图象中的认证码不易被其它程序探测到   
		        g.setColor(getRandColor(160, 200));   
		        // 生成随机类   
		        Random random = new Random();   
		        for (int i = 0; i < 155; i++) {   
		          int x2 = random.nextInt(width);   
		          int y2 = random.nextInt(height);   
		          int x3 = random.nextInt(12);   
		          int y3 = random.nextInt(12);   
		          g.drawLine(x2, y2, x2 + x3, y2 + y3);   
		        }   
		        // 将认证码显示到图象中   
		        g.setColor(new Color(20 + random.nextInt(110), 20 + random   
		            .nextInt(110), 20 + random.nextInt(110)));   
		        g.drawString(s, 2, 16);   
		        // 图象生效   
		        g.dispose();   
		        // 输出图象到页面   
		        ImageIO.write((BufferedImage) image, "JPEG", out);   
		        out.close();   
		        
		        
		        System.out.println("验证码:"+ActionContext.getContext().getSession().get("validateCode"));
		        
		        
		      } 
		 	  catch (Exception e) {   
		        e.printStackTrace();   
		      }   
		      return null;   
		    }
	
	 		// 给定范围获得随机颜色
		    private 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);   
		  }  

 界面

<img src="memory/validateCode.action" style="cursor:pointer;"/>
	    			<input id="validationCode" type="text" value="<%=session.getAttribute("validateCode")%>"></input>

 

js代码

var validationCode=document.getElementById("validationCode");
	alert(validationCode.value);

 

误区,一般会认为jsp页面按顺序执行,先加载图片,执行了execute方法,此时验证码已经存入session,再将验证码放入hidden隐藏域……

实际上jsp也页面的处理过程如下:

1.首先将jsp页面生成一个servlet源程序文件

2.然后调用java编译器将这个文件处理成.class文件

3.并由Servlet引擎来装载并执行这个.class文件

 

上面的页面执行过程如下:

1.该jsp页面生成Servlet源程序文件

2.该源程序被处理成.class文件

3.Servlet引擎装载处理该.class文件,此时session.getAttribute("validateCode")已经被执行了

4.将处理结果发送给客户端浏览器

5.浏览器遇到img标签执行execute方法

 

所以实际上以上方法第一次隐藏域中的值为null,以后每次的值都是前一次的值

分享到:
评论

相关推荐

    struts2生成中文验证码的Action

    在这个特定的场景中,我们讨论的是如何在Struts2中创建一个能够生成中文验证码的Action。 验证码的主要目的是防止自动机器人或恶意攻击,通过向用户提供一组随机字符(通常是数字和/或字母)来验证他们是否是真实的...

    struts2实现验证码

    我们可以使用一个`&lt;img&gt;`标签来显示验证码图片,图片的src属性指向一个Struts2 Action,该Action负责生成并返回验证码的图片。图片可以通过将验证码字符串转换为像素并绘制到图像上实现。 4. **配置Struts2 Action*...

    asp.net mvc验证码实现

    这个Action将调用上面的`CaptchaGenerator`类来生成验证码图像,并将其作为HTTP响应的图像内容返回。 5. **视图渲染**: 在需要显示验证码的视图中,可以使用HTML图像元素指向刚才创建的Action。例如,`...

    action实现验证码

    对登录的验证码进行验证的完整代码,对于新手很方便,易明白,是基于SSH的使用

    安卓发送验证码倒计时效果和自动获取验证码并填充

    通过实现BroadcastReceiver类,重写onReceive()方法,注册对应的SMS_RECEIVED ACTION广播,可以监听到接收到的验证码短信。注意,由于安全性和隐私原因,只有用户在应用中明确授权,应用才能监听短信。 4. **UI倒...

    java web加法验证码实例

    在Spring中,我们可以配置一个Bean来代表验证码服务,然后在Struts2 Action中注入这个服务,以便获取和验证验证码。在Hibernate中,虽然通常不需要直接与验证码交互,但如果有存储用户验证历史需求,我们可以利用...

    验证码工具类.zip

    本资源提供了两种实现方式:基于Servlet和Struts2(Action)的验证码工具类。以下是对这两个版本的验证码工具类的详细解释。 ### Servlet版验证码工具类 1. **验证码生成**: Servlet版本的验证码工具类通常会...

    Kaptcha验证码

    5、验证在服务器端,通常在处理用户提交表单的 action 中,会校验用户输入的验证码是否与 session 中的验证码相匹配,以确保安全性。例如: ```java @RequestMapping(value = "/yourAction", method = Request...

    android 短信验证码自动填充

    在Android开发中,实现短信验证码自动填充是一项提升用户体验的重要功能。这一特性允许应用程序在接收到短信验证码后,自动将其填入到相应的输入框中,从而减少用户手动输入的步骤,提高验证过程的效率。以下是对这...

    登录界面的验证码代码

    ### 登录界面的验证码代码详解 #### 一、概述 在现代互联网应用中,为了防止自动化工具或恶意脚本对网站进行攻击或者垃圾注册等行为,通常会在用户登录时加入验证码这一环节。本文将深入分析一份典型的登录界面...

    struts中实现验证码

    Action的参数(如宽度、高度、长度和随机字符串)可以用来定制验证码的外观和字符集。`result`节点配置了结果类型为`stream`,意味着返回的是一个流,通常用于返回图片内容。`contentType`属性设为`image/jpeg`表示...

    验证码登陆(SSH初级整合)

    验证码的生成和验证可以通过自定义Action或拦截器实现,确保用户输入的验证码与服务器生成的一致。 4. 验证码技术:验证码的主要目的是防止自动化脚本或机器人对系统的非法访问。在这个项目中,验证码可能是通过...

    基于struts1.x的验证码实现

    1. **生成随机验证码**:首先,我们需要创建一个服务或者Action,生成一个随机字符串作为验证码。这个字符串可以包含字母、数字,甚至符号,长度可以根据需求来设定。生成的验证码通常要存储在一个会话(session)...

    jsp用户登录验证码

    ### jsp用户登录验证码知识点详解 #### 一、概述 在Web应用开发中,为了防止自动化工具或恶意脚本对登录系统的频繁尝试,通常会在登录界面加入验证码功能。验证码(CAPTCHA)是一种用来区分人与计算机的技术手段。...

    Struts2的验证码生成

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

    Extjs4登录功能+验证码+struts2

    通常,验证码的生成和验证需要后端支持,例如通过Struts2的Action类生成验证码图片并存储其值,然后在提交表单时比较用户输入的验证码与服务器端保存的值是否一致。 Struts2是一个基于MVC(Model-View-Controller)...

    struts2,hibernate,mybatis验证码,分页

    3. **用户提交**:用户输入验证码后,Action接收到请求,从Session中获取预先生成的验证码,并与用户输入的值进行对比。 4. **错误处理**:如果输入的验证码不匹配,返回错误信息,并可能清除Session中的验证码以...

    struts2 生成验证码

    该Action类是生成验证码的核心组件,主要实现了生成验证码图片的功能。 - **导入必要的包**: - `java.awt.*`:用于绘制验证码图片。 - `java.awt.image.BufferedImage`:表示图像的对象。 - `java.io.*`:处理...

    mvc验证码源码及插件

    4. 处理验证:在控制器(Controller)的Action方法中,检查用户提交的验证码是否有效,如果验证失败,可以根据需要返回错误信息或重定向至验证码输入页。 对于开发和调试,理解验证码源码可以帮助我们更好地定制...

    JSP自动生成彩色验证码

    提交表单后,服务器端的action类(可能是一个Servlet或Struts Action)会接收到请求,从会话中取出预存的验证码字符串,与用户输入的验证码进行比对,判断是否匹配,从而完成验证。 验证码的验证流程通常如下: 1. ...

Global site tag (gtag.js) - Google Analytics