基于struts2框架下的验证码实现
来源:互联网 发布:应用包安装软件 编辑:程序博客网 时间:2024/05/18 02:51
1、配置struts2框架
2、在com.itany.util下新建文件 IdentifyCodeUtil.java
package com.itany.util;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.Random;import javax.imageio.ImageIO;import javax.imageio.stream.ImageOutputStream;import com.sun.image.codec.jpeg.ImageFormatException;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;public class IdentifyCodeUtil{ // 随机产生的验证码字符都是从下面的字符串中获取的 private String s = "0123456789abcdefghijklmnopqrstuvwxyz"; // 图片的字节流 private InputStream imageStream; // 验证码图片对应的验证码字符串 private String identifyCode; // 私有的构造方法 private IdentifyCodeUtil() { init(); } public InputStream getImageStream() { return imageStream; } public String getIdentifyCode() { return identifyCode; } public static IdentifyCodeUtil Instance() { return new IdentifyCodeUtil(); } private void init() { int width, height; width = 100;// 图片宽度 height = 30;// 图片高度 // 在内存中创建图片对象,宽度为width,高度为height BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics graphics = image.getGraphics(); // 设置图片背景色 graphics.setColor(Color.WHITE); // 填充背景色 graphics.fillRect(0, 0, width, height); graphics.setColor(Color.DARK_GRAY); // 设置字体 graphics.setFont(new Font("宋体", Font.BOLD + Font.ITALIC, 30)); // 生成随机类 Random random = new Random(); // 生成长度为5位的字符串,并放入sb中 StringBuffer sb = new StringBuffer(); for (int i = 0; i < 5; i++) { int index = random.nextInt(s.length()); sb.append(s.charAt(index)); // 将认证码显示到图象中 graphics.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 graphics.drawString(s.charAt(index) + "", 15 * i + 6, 25); } // 重新设置字体的颜色,使其与线条的颜色不同 graphics.setColor(getRandColor(170, 250)); // 先设置线条的颜色,再随机产生120条干扰线,使图象中的认证码不易被其它程序探测到 graphics.setColor(getRandColor(120, 200)); for (int i = 0; i < 120; i++) { int x = random.nextInt(width);// 每条线条的起点坐标 int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); graphics.drawLine(x, y, x + xl, y + yl); } this.identifyCode = sb.toString(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos); try { encoder.encode(image); } catch (ImageFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } this.imageStream = new ByteArrayInputStream(bos.toByteArray()); } /* * 给定范围获得随机颜色 */ 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); }}
3、在包 com.itany.action 下新建文件 BaseAction.java
package com.itany.action;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.ServletResponseAware;import org.apache.struts2.interceptor.SessionAware;import org.apache.struts2.util.ServletContextAware;import com.opensymphony.xwork2.ActionSupport;public class BaseAction extends ActionSupport implements ServletRequestAware, ServletResponseAware, ServletContextAware, SessionAware{ protected HttpServletRequest request; protected HttpServletResponse response; protected ServletContext application; protected Map<String, Object> session; public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletResponse(HttpServletResponse response) { this.response = response; } public void setServletContext(ServletContext application) { this.application = application; } public void setSession(Map<String, Object> session) { this.session = session; } }
4、在包 com.itany.action 下新建文件 ImageAction.java
package com.itany.action;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.util.Random;import com.itany.util.IdentifyCodeUtil;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;import org.apache.struts2.json.annotations.JSON;public class ImageAction extends BaseAction{ private InputStream imageStream; /* private String s = "0123456789abcdefghijklmnopqrstuvwxyz"; */ public InputStream getImageStream() { return imageStream; } public void setImageStream(InputStream imageStream) { this.imageStream = imageStream; } @Override public String execute() throws Exception { IdentifyCodeUtil icu = IdentifyCodeUtil.Instance(); session.put("code", icu.getIdentifyCode()); imageStream = icu.getImageStream(); return SUCCESS; }}
5、在包 com.itany.action 下新建文件 SecurityAction.java
package com.itany.action;import javax.servlet.ServletOutputStream;import org.apache.struts2.json.annotations.JSON;public class SecurityAction extends BaseAction{ private String info; public SecurityAction() { super(); } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } @Override public String execute() throws Exception { String code = (String)session.get("code"); if (code.equals(info)) { info = "true"; return SUCCESS; } else { info = "false"; return SUCCESS; } }}
6、在src下面配置struts文件struts.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd" ><struts><package name="result" namespace="/result" extends="struts-default"><result-types><result-type name="json" class="org.apache.struts2.json.JSONResult" /></result-types><action name="image" class="com.itany.action.ImageAction"><result type="stream"><param name="inputName">imageStream</param></result><result name="fail" type="redirect">/fail.jsp</result></action><action name="security" class="com.itany.action.SecurityAction"><result type="json"><param name="root">info</param></result></action></package></struts>
7、在WEB-ROOT下新建image.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags"%><html><head><script type="text/javascript" src="js/jquery-1.4.min.js"></script><script type="text/javascript"> var timer2 = null; var num = 0; function changeImage() { var img = document.getElementById("img"); img.src = "${pageContext.request.contextPath}/result/image.action?a=" + new Date().getTime(); return false;//因为是用onclik触发,所以为了防止跳转,此处用false } function h(info) { //$("#message").html("正在验证......"); timer2 = window.setInterval("show()", 250);//每隔0.25秒执行一次show()方法 $ .post( "${pageContext.request.contextPath}/result/security.action", { "info" : info }, function(data) { if (data == "true") { $("#message") .html( "<img style='vertical-align:top;' src='image/success.png' />验证码输入正确"); isImageCodeRight = true; window.clearInterval(timer2);//清除已设置的setInterval对象 } else { $("#message") .html( "<img style='vertical-align:top;' src='image/fail.png' />验证输入错误"); isImageCodeRight = false; window.clearInterval(timer2);//清除已设置的setInterval对象 }
}); } function show() { var info = "正在验证"; for ( var i = 0; i < num; i++) { info = info + "."; } if (num < 6) { num = num + 1; } else { num = 0; } $("#message").html(info); }</script></head><body> 验证码: <a href="javascript:;" onclick="return changeImage();"><img id="img" src="${pageContext.request.contextPath }/result/image.action" title="点击图片刷新验证码" style="border: solid 2px red" /></a> <br /> <input type="text" name="code" id="code" onblur="h(this.value);" /> <span id="message" style="color: red;"></span></body></html>
- 基于struts2框架下的验证码实现
- 基于SSH2框架Struts2拦截器的登录验证实现
- 基于SSH2框架Struts2拦截器的登录验证实现
- 基于SSH2框架Struts2拦截器的登录验证实现
- 基于SSH2框架Struts2拦截器的登录验证实现
- 基于SSH2框架Struts2拦截器的登录验证实现
- 基于Struts2验证框架的输入验证
- struts2基于验证框架的输入校验
- 基于struts2的一个验证码的实现
- 基于struts2+spring+ibatis彩色随机验证码的实现
- 基于SSH2框架Struts2拦截器的登录验证实现 (转)
- 基于SSH2框架Struts2拦截器的登录验证实现 来自菠萝大象
- 基于SSH2框架下的 用户注册 验证码功能
- 关于Struts2基于验证框架的输入校验的经验
- 基于ssh2架构的struts2验证框架错误解决
- struts2的验证框架
- struts2的框架验证
- struts2 的验证框架
- Android 读写xml文件
- C++_拷贝构造函数
- cocos2d-x ccsprite 详解
- AutoCAD常用快捷键
- java中==和equals的区别
- 基于struts2框架下的验证码实现
- C++_指针悬挂和赋值操作符的重载
- 第一篇
- ExtJs学习笔记(3)事件
- c语言编写从键盘上任意输入10个数,分别统计出输入的偶数或奇数分别的平均值
- 闪存概述
- 动态库(.so)
- C++_运算符重载
- C++_函数模板基础知识