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

朱雀 2021-11-09 03:46 366阅读 0赞

这篇文章主要介绍了Struts2实现生成动态验证码并验证实例代码的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

一、基本流程:

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

二、方法:

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

  1. package com.zhuguang.action;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.util.Map;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.apache.struts2.interceptor.ServletResponseAware;
  9. import org.apache.struts2.interceptor.SessionAware;
  10. import com.opensymphony.xwork2.ActionSupport;
  11. import com.sun.image.codec.jpeg.JPEGCodec;
  12. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  13. public class TestAction extends ActionSupport implements SessionAware,ServletResponseAware
  14. {
  15. private Map<String, Object> session;
  16. private HttpServletResponse response;
  17. private static final long serialVersionUID = 1L;
  18. private String chknumber;
  19. @Override
  20. public String execute() throws Exception
  21. {
  22. response.setHeader("Cache-Control", "no-cache");
  23. int width=50; //图片宽度
  24. int height=20; //图片高度
  25. BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  26. Graphics graphics=image.createGraphics();
  27. graphics.setColor(this.getColor()); //背景颜色
  28. graphics.fillRect(0, 0, width, height);
  29. graphics.setFont(new Font("Arial",Font.BOLD,18));
  30. graphics.setColor(this.getColor()); //字的颜色
  31. String number=String.valueOf(System.currentTimeMillis()%9000+1000); //生成四位随机数
  32. session.put("randomCode", number); //写入session中
  33. graphics.drawString(number, (int)(width*0.1), (int)(height*0.8));
  34. graphics.dispose();
  35. JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(response.getOutputStream());
  36. encoder.encode(image);
  37. response.getOutputStream().flush(); //刷新到页面生成图片
  38. response.getOutputStream().close(); //关闭writer
  39. return null;
  40. }
  41. private Color getColor(){
  42. int red=(int)(Math.random()*1000%256);
  43. int green=(int)(Math.random()*1000%256);
  44. int blue=(int)(Math.random()*1000%256);
  45. return new Color(red,green,blue);
  46. }
  47. public String getChknumber()
  48. {
  49. return chknumber;
  50. }
  51. public void setChknumber(String chknumber)
  52. {
  53. this.chknumber = chknumber;
  54. }
  55. @Override
  56. public void setSession(Map<String, Object> session)
  57. {
  58. // TODO Auto-generated method stub
  59. this.session = session;
  60. }
  61. @Override
  62. public void setServletResponse(HttpServletResponse response)
  63. {
  64. // TODO Auto-generated method stub
  65. this.response = response;
  66. }
  67. }

  注意用到session和response

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

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

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

3、jsp页面编写

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

4、验证

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

  1. public String testLogin()
  2. {
  3. if(session.get("randomCode").equals(chknumber)) {
  4. return SUCCESS;
  5. }
  6. else{
  7. return ERROR;
  8. }
  9. }

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

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

转载请标明出处:Struts2实现生成动态验证码并验证实例代码_java_脚本之家

发表评论

表情:
评论列表 (有 0 条评论,366人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态生成验证

    动态生成验证码在很多地方可以用到,最近在学习牛腩视频的时候,正好看到了,就此简单总结一下。 为了简单方便,我们新建一个验证码测试的项目名为test,然后在项目中新建一个文件夹