```
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的验证码案例的更多相关文章

  1. java 基于tomcat的数据源案例

    1.在context中定义数据源 <?xml version="1.0" encoding="UTF-8"?> <Context path=& ...

  2. Java 之 Response 发送验证码案例

    定义一个 Servlet 用来在内存中生成 二维码图片,并向浏览器页面输出. import javax.imageio.ImageIO; import javax.servlet.ServletExc ...

  3. JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC

    接上篇<JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP.IOC)>,了解了Spring的核心(AOP.IOC)后,我们再来学习与实践Maven.Sp ...

  4. Spring+springmvc+Mybatis整合案例 annotation版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:annotation版 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version=&qu ...

  5. 基于SpringMVC+Ext.js的权限管理系统(无权限框架)

    代码地址如下:http://www.demodashi.com/demo/12811.html 0.准备工作 注意!!! 本案例数据库相关请下载例子包,内有数据库脚本.EXCEL数据表和详细的设计文档 ...

  6. Spring+springmvc+Mybatis整合案例 xml配置版(myeclipse)详细版

    Spring+springmvc+Mybatis整合案例 Version:xml版(myeclipse) 文档结构图: 从底层开始做起: 01.配置web.xml文件 <?xml version ...

  7. 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】

    基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...

  8. springMVC用法 以及一个简单的基于springMVC hibernate spring的配置

    替代struts 1  web.xml中配置springmvc中央控制器 <?xml version="1.0" encoding="UTF-8"?> ...

  9. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

随机推荐

  1. requirejs的打包工具r.js

    不建议用命令行,还是用配置文件比较方便--build.js. 我的build.js文件内容大概如下: ( { appDir : './', baseUrl : './scripts', dir : ' ...

  2. 洛谷 1344 [USACO4.4]追查坏牛奶Pollutant Control——最大流

    题目:https://www.luogu.org/problemnew/show/P1344 那个边数的限制,只要把边权乘1001再+1即可.乘1001是因为有1000条边,这样流量小的不会因为边数多 ...

  3. bzoj 4275 Badania naukowe —— DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4275 枚举 \( C \) 在 \( A \) 和 \( B \) 中的位置,然后取它前后的 ...

  4. Python实例浅谈之五Python守护进程和脚本单例运行

    一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc ...

  5. nagios客户端安装与配置windows篇

    一.被监控的windows xp客户端的配置 1.安装NSClient++并安装下载地址: http://sourceforge.net/projects/nscplusNSClient++-0.3. ...

  6. jsonp实现数据跨域请求

    1.我们知道,哪怕跨域js文件中的代码(当然指符合web脚本安全策略的),web页面也是可以无条件执行的. 远程服务器remoteserver.com根目录下有个remote.js文件代码如下: al ...

  7. MySQL之创、增、删、改、查

    MySQL Select version();  当前服务器版本 Select database();  查看当前工作数据库 Show databases;   显示所有数据库 Select user ...

  8. Ubuntu下CodeBlocks更改调试终端

    Ubuntu下CodeBlocks更改调试终端   Ubuntu下的CodeBlocks自带的调试终端xterm不能进行复制粘贴操作,更换调试终端就可以解决了,就是把ubuntu下的gnome-ter ...

  9. Spring入门第十九课

    后置通知 看代码: package logan.study.aop.impl; public interface ArithmeticCalculator { int add(int i, int j ...

  10. UVaLive 4727 Jump (递推)

    题意:约瑟夫环,求最后三个数. 析:f[i] = (f[i-1] + k) % i 这是求最后一个数时候,我们倒着推到第一个数时,只有一个数,所以当只有两个数时,就是另一数, 同理,我们可以求得第三个 ...