Struts2实现生成动态验证码并验证实例代码

 更新时间:2016年06月02日 14:17:52   作者:meaijojo  
这篇文章主要介绍了Struts2实现生成动态验证码并验证实例代码的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

 一、基本流程:

产生一个验证码页面(很小)→嵌入到表单中→点击可以刷新页面→表单提交时验证。

二、方法:

1、定义TestAction,实现画图方法

package com.zhuguang.action; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.util.Map; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.struts2.interceptor.ServletResponseAware; 
import org.apache.struts2.interceptor.SessionAware; 
import com.opensymphony.xwork2.ActionSupport; 
import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageEncoder; 
public class TestAction extends ActionSupport implements SessionAware,ServletResponseAware 
{ 
private Map<String, Object> session; 
private HttpServletResponse response; 
private static final long serialVersionUID = 1L; 
private String chknumber; 
@Override 
public String execute() throws Exception 
{ 
response.setHeader("Cache-Control", "no-cache"); 
int width=50; //图片宽度 
int height=20; //图片高度 
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 
Graphics graphics=image.createGraphics(); 
graphics.setColor(this.getColor()); //背景颜色 
graphics.fillRect(0, 0, width, height); 
graphics.setFont(new Font("Arial",Font.BOLD,18)); 
graphics.setColor(this.getColor()); //字的颜色 
String number=String.valueOf(System.currentTimeMillis()%9000+1000); //生成四位随机数 
session.put("randomCode", number); //写入session中 
graphics.drawString(number, (int)(width*0.1), (int)(height*0.8)); 
graphics.dispose(); 
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(response.getOutputStream()); 
encoder.encode(image); 
response.getOutputStream().flush(); //刷新到页面生成图片 
response.getOutputStream().close(); //关闭writer 
return null; 
} 
private Color getColor(){ 
int red=(int)(Math.random()*1000%256); 
int green=(int)(Math.random()*1000%256); 
int blue=(int)(Math.random()*1000%256); 
return new Color(red,green,blue); 
} 
public String getChknumber() 
{ 
return chknumber; 
} 
public void setChknumber(String chknumber) 
{ 
this.chknumber = chknumber; 
} 
@Override 
public void setSession(Map<String, Object> session) 
{ 
// TODO Auto-generated method stub 
this.session = session; 
} 
@Override 
public void setServletResponse(HttpServletResponse response) 
{ 
// TODO Auto-generated method stub 
this.response = response; 
} 
} 

注意用到session和response

2、在struts.xml文件中注册:

<action name="randomCode" class="com.zhuguang.action.TestAction"> 
</action> 

其中不返回任何信息,这样就不会跳转页面

3、jsp页面编写

<%@ page language="java" contentType="text/html; charset=UTF-8" 
pageEncoding="UTF-8"%> 
<%@taglib uri="/struts-tags" prefix="s" %> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<script type="text/javascript"> 
<!-- 
function reloadcode(obj,base){ 
var rand=new Date().getTime(); //这里用当前时间作为参数加到url中,是为了使URL发生变化,这样验证码才会动态加载, 
//只是一个干扰作用,无确实意义,但却又非常巧妙,呵呵 
obj.src=base+"randomCode.action?abc="+rand; //其实服务器端是没有abc的字段的。 
} 
//--> 
</script> 
<title>测试页面</title> 
</head> 
<body> 
<form action="testLogin" method="post"> 
Username<input type="text" name="name"><br> 
Password<input type="text" name="password"><br> 
验证码:<input type="text" name="chknumber" id="chknumber" maxlength="4" class="chknumber_input"> 
<img title="看不清楚请点击这里" width="50" height="20" src="<%=basePath%>randomCode.action" id="safecode" onclick="reloadcode(this,'<%=basePath%>')" /><br> 
<input type="submit" value="Loginin"> 
</form> 
</body> 
</html> 

4、验证

(1)在Action中添加一个验证方法

public String testLogin() 
{ 
if(session.get("randomCode").equals(chknumber)) 
{ 
return SUCCESS; 
} 
else 
{ 
return ERROR; 
} 
} 

(2)在struts.xml中进行注册

<action name="testLogin" class="com.zhuguang.action.TestAction" method="testLogin">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>

以上所述是小编给大家介绍的Struts2实现生成动态验证码并验证实例代码,希望对大家有所帮助!

相关文章

  • SpringMvc返回modelandview返回的页面无法跳转问题及解决

    SpringMvc返回modelandview返回的页面无法跳转问题及解决

    这篇文章主要介绍了SpringMvc返回modelandview返回的页面无法跳转问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • CentOS 7.9服务器Java部署环境配置的过程详解

    CentOS 7.9服务器Java部署环境配置的过程详解

    这篇文章主要介绍了CentOS 7.9服务器Java部署环境配置,主要包括ftp服务器搭建过程、jdk安装方法以及mysql安装过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • springboot3如何接入nacos

    springboot3如何接入nacos

    这篇文章主要介绍了springboot3接入nacos的配置方法,经过很长时间的折腾终于搞定,下面把步骤操作过程分享给大家,需要的朋友可以参考下
    2024-03-03
  • JAVA开发环境Vs code配置步骤详解

    JAVA开发环境Vs code配置步骤详解

    这篇文章主要为大家介绍了JAVA开发环境Vs code配置步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 基于Java编写简易的算式测试程序

    基于Java编写简易的算式测试程序

    本文将利用Java语言编写一个简易的算式测试程序,这个程序可以自动生成指定数量的加减乘三则运算题目,感兴趣的小伙伴可以了解一下
    2022-05-05
  • public static void main(String[] args)使用解读

    public static void main(String[] args)使用解读

    这篇文章主要介绍了public static void main(String[] args)的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java流程控制语句最全汇总(中篇)

    Java流程控制语句最全汇总(中篇)

    这篇文章主要介绍了Java流程控制语句最全汇总(中篇),本文章内容详细,通过案例可以更好的理解数组的相关知识,本模块分为了三部分,本次为中篇,需要的朋友可以参考下
    2023-01-01
  • 详解Java Synchronized的实现原理

    详解Java Synchronized的实现原理

    谈到多线程就不得不谈到Synchronized,重要性不言而喻,今天主要谈谈Synchronized的实现原理。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-09-09
  • IDEA快速搭建Java开发环境的教程图解

    IDEA快速搭建Java开发环境的教程图解

    这篇文章主要介绍了IDEA如何快速搭建Java开发环境,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Java实现文件的归档和解档

    Java实现文件的归档和解档

    这篇文章主要为大家详细介绍了Java实现文件的归档和解档,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论