Java基于springMVC的验证码案例
```
Java验证码案例(基于springMVC方式) 验证码工具类
package com.ekyb.common.util; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics; import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; /**
* 图片验证码生成类
*
* @author gx
*/
@Component("imageCode")
public class ImageCode {
/*
* Spring 3支持@value注解的方式获取properties文件中的配置值,大简化了读取配置文件的代码。
* 在applicationContext.xml文件中配置properties文件,在bean中使用@value注解获取配置文件的值
* 即使给变量赋了初值也会以配置文件的值为准。
*/
@Value("${ImageCode.width}")
private int width; @Value("${ImageCode.height}")
private int height; @Value("${ImageCode.codeLength}")
private int codeLength; @Value("${ImageCode.randomString}")
private String randomString; @Value("${ImageCode.sessionKey}")
private String sessionKey; @Value("${ImageCode.font.name}")
private String fontName; @Value("${ImageCode.font.style}")
private int fontStyle; @Value("${ImageCode.font.size}")
private int fontSize; public BufferedImage getImage(HttpServletRequest request) {
// 在内存中创建图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图片上下文
Graphics g = image.getGraphics();
// 生成随机类
Random random = new Random();
// 设定背景颜色
g.setColor(getRandColor(100, 250));
g.fillRect(0, 0, width, height);
// 设定字体
g.setFont(new Font(fontName, fontStyle, fontSize));
g.setColor(getRandColor(160, 200));
for (int i = 0; i < 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, xl, y + yl);
}
// 取随机产生的认证码
String sRand = randomRand(codeLength);
int strWidth = width / 2 - g.getFontMetrics().stringWidth(sRand) / codeLength - fontSize;
int strHeight = height / 2 + g.getFontMetrics().getHeight() / 4;
for (int i = 0; i < codeLength; i++) {
String rand = sRand.substring(i, i + 1);
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
g.drawString(rand, 13 * i + 6 + strWidth, strHeight);
}
//System.out.println(sRand);
request.getSession().setAttribute(sessionKey, sRand);
request.setAttribute("sRand", sRand);
g.dispose();
return image;
} public static String randomResult(int length) {
String[] i = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
List<String> l = new ArrayList<String>();
l.addAll(Arrays.asList(i));
Random ran = new Random();
String s = "";
while (l.size() > 10 - length)
s += l.remove(ran.nextInt(l.size()));
s = s.replaceAll("^(0)(\\d)", "$2$1");
return s;
} // 给定范围获取随机颜色
public 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); } private String randomRand(int n) {
String rand = "";
int len = randomString.length() - 1;
double r;
for (int i = 0; i < n; i++) {
r = ((Math.random())) * len;
rand = rand + randomString.charAt((int) r);
}
return rand;
} public int getWidth() {
return width;
} public void setWidth(int width) {
this.width = width;
} public int getHeight() {
return height;
} public void setHeight(int height) {
this.height = height;
} public int getCodeLength() {
return codeLength;
} public void setCodeLength(int codeLength) {
this.codeLength = codeLength;
} public String getRandomString() {
return randomString;
} public void setRandomString(String randomString) {
this.randomString = randomString;
} public String getSessionKey() {
return sessionKey;
} public void setSessionKey(String sessionKey) {
this.sessionKey = sessionKey;
} public String getFontName() {
return fontName;
} public void setFontName(String fontName) {
this.fontName = fontName;
} public int getFontStyle() {
return fontStyle;
} public void setFontStyle(int fontStyle) {
this.fontStyle = fontStyle;
} public int getFontSize() {
return fontSize;
} public void setFontSize(int fontSize) {
this.fontSize = fontSize;
} } -----------------------------------------------
读取config.properties配置的验证码和图片设置 #ImageCode生成器配置
ImageCode.width=120
ImageCode.height=38
ImageCode.codeLength=4
ImageCode.randomString=ABCDEFGHIJKLMNPQRSTUVWXYZ1234567890abcdefghijkmnpqrstuvwxyz
ImageCode.sessionKey=SESSIONCODE
ImageCode.font.name=Times New Roman
ImageCode.font.style=0
ImageCode.font.size=18
-------------------------------------------------
springMVC action中的代码
package com.ekyb.common.auContract.action; import java.io.IOException; import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.ekyb.common.util.ImageCode; @Controller
@RequestMapping(value="/yanZhen")
public class YanZhenMaAction {
/*
* @Resource默认按 byName 自动注入,是J2EE提供的, 需导入Package: javax.annotation.Resource;
*
* @Resource有两个中重要的属性:name和type ,而Spring将@Resource注解的name属性解析为bean的
* 名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用 type属性时则使用
* byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用by Name自动注入策略。
*/
@Resource
ImageCode imageCode; private static String sRand; @RequestMapping(value = "/openLoginPage")
public String openLoginPage(HttpServletRequest request, HttpServletResponse response) {
String msg=request.getParameter("msg");
if(msg==null&& msg.isEmpty()){
//得到用户读入框信息,如果没有输入或者为空,直接跳转到验证失败页面
return "error";
}else{
if(sRand.equalsIgnoreCase((msg))){
//得到用户输入的验证码匹配成功,跳转到验证通过页面
return "ok";
}else{
//得到用户输入的验证码匹配失败,跳转到验证失败页面
return "error";
}
}
} @RequestMapping(value = "/getImage")
public void getImage(HttpServletRequest request, HttpServletResponse response
) throws IOException {
// 禁止图片缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
// 将图像输出到servlet输出流中
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(imageCode.getImage(request), "jpeg", sos);
sos.close();
sRand=(String)request.getAttribute("sRand");
String result="ok"; }
}
-------------------------------------------------
前端登录页面代码
<%@ page language="java" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登录</title>
</head>
<script type="text/javascript" src="js/jquery-easyui/jquery.min.js"></script>
<body>
<!-- cursor: pointer;鼠标放上显示手; title:鼠标放上时显示的文字 -->
<img id="imageCode" alt="" src="" onclick="checkcode()" style="cursor: pointer;" title="点我更换验证码" />
<br>
<form action="<%=basePath%>yanZhen/openLoginPage" method="post">
<input type="text" value="" name="msg">
<input type="submit" value="提交">
</form>
</body>
<script type="text/javascript">
var basePath = "<%=basePath%>";
$(function() {
checkcode();
});
function checkcode() {
var XMLHttp = null;
if (window.XMLHttpRequest) {
XMLHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
XMLHttp.onreadystatechange = function() {
if (XMLHttp.readyState == 4) {
//改变验证码图片
$("#imageCode").attr("src",(basePath + "/yanZhen/getImage?" + new Date()));
}
};
//将请求发送出去
//加上 new Date()防止浏览器缓存,不重新发送请求
XMLHttp.open("GET", basePath + "/yanZhen/getImage?" + new Date(), true);
XMLHttp.send(null);
}
</script>
</html>
-----------------------------------------------------
登录成页面ok.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>验证通过</title>
</head>
<body>
<h2>验证通过</h2>
</body>
</html>
-------------------------------------------------
登录失败页面error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>验证失败</title>
</head> <body>
<h2>验证失败</h2>
</body>
</html>
--------------------
==****注意个别路径根据自己的文件路劲更改==
如果有误请多指教
```
Java基于springMVC的验证码案例的更多相关文章
- java 基于tomcat的数据源案例
1.在context中定义数据源 <?xml version="1.0" encoding="UTF-8"?> <Context path=& ...
- Java 之 Response 发送验证码案例
定义一个 Servlet 用来在内存中生成 二维码图片,并向浏览器页面输出. import javax.imageio.ImageIO; import javax.servlet.ServletExc ...
- JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC
接上篇<JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP.IOC)>,了解了Spring的核心(AOP.IOC)后,我们再来学习与实践Maven.Sp ...
- Spring+springmvc+Mybatis整合案例 annotation版(myeclipse)详细版
Spring+springmvc+Mybatis整合案例 Version:annotation版 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version=&qu ...
- 基于SpringMVC+Ext.js的权限管理系统(无权限框架)
代码地址如下:http://www.demodashi.com/demo/12811.html 0.准备工作 注意!!! 本案例数据库相关请下载例子包,内有数据库脚本.EXCEL数据表和详细的设计文档 ...
- Spring+springmvc+Mybatis整合案例 xml配置版(myeclipse)详细版
Spring+springmvc+Mybatis整合案例 Version:xml版(myeclipse) 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version ...
- 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...
- springMVC用法 以及一个简单的基于springMVC hibernate spring的配置
替代struts 1 web.xml中配置springmvc中央控制器 <?xml version="1.0" encoding="UTF-8"?> ...
- Java基于opencv实现图像数字识别(五)—投影法分割字符
Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...
随机推荐
- 使用mutt+msmtp做linux邮件客户端
下载MSMTP wget http://nchc.dl.sourceforge.net/sourceforge/msmtp/msmtp-1.4.17.tar.bz2 tar xvf msmtp-1 ...
- CodeForces - 884F :Anti-Palindromize(贪心&费用流)
A string a of length m is called antipalindromic iff m is even, and for each i (1 ≤ i ≤ m) ai ≠ am - ...
- MyEclipse异常关闭导致启动不了tomcat的解决方法
由于MyEclipse的异常关闭从而导致Tomcat并没有关闭,所以再次启动Tomcat当然是无法启动的啦,解决方法:在任务管理器中关闭一个叫javaw.exe的进程,如果你这时已经启动了MyEcl ...
- Swift范性
关于泛型 「泛型」(Generic Code)也许是Swift相对于OC的最大特性之一吧!基于Swift的「泛型」特性,你能够写出扩展性更强.复用性更强的方法.类型,它可以让你尽可能避免重复代码,用一 ...
- ACM学习历程—ZOJ3878 Convert QWERTY to Dvorak(Hash && 模拟)
Description Edward, a poor copy typist, is a user of the Dvorak Layout. But now he has only a QWERTY ...
- exosip 和 pjsip 简介
oSIP oSIP的开发开始于2000年7月,第一个版本在2001年5月发 布,到现在已经发展到3.x了.它采用ANSI C编写,而且结 构简单小巧,所以速度特别快,它并不提供高层的SIP会话 控制 ...
- java性能调优的11个建议
1.在必要之前,先不要优化 2.使用分析器来找到真正的瓶颈 3 .为整个应用程序创建性能测试套件 4.首先解决最大的瓶颈问题 5.使用StringBuilder以编程方式连接字符串 Str ...
- 用idea工具对java打包:命令 mvn clear package,报错
用idea工具对java打包:命令 mvn clear package,报错 网上都是eclipse的,要么是project structure和setting的(当然这俩也要用) 我都试了,每一个能 ...
- python3中,pycharm中怎么连接数据库
因为python3现在还不能直接连接数据库,所有如果想连接,就只能通过以下方法: 在APP中的,__init__.py中,添加以下代码就可以: import pymysql pymysql.insta ...
- 1.14不使用回车键来读取n个字符
read是一个重要的bash命令,它用于从键盘或标准输入中读取文本.可以使用read以交互的形式读取来自用户的输入,不过read能做的远不止这些.很多编程语言的输入库都是从键盘读取输入,且只有回车键按 ...