页面

<%@ 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>My JSP 'code.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

<!--

<link rel="stylesheet" type="text/css" href="styles.css">

-->

<script src="js/jquery-1.7.2.min.js"></script>

<script type="text/javascript">

function changeImg() {

var imgSrc = $("#imgObj");

var src = imgSrc.attr("src");

//alert(src);

imgSrc.attr("src", chgUrl(src));

alert($("#code").val());

//$("#code").val("123456");

//<c:out value="${sessionScope.code}"/>

}

//时间戳

//为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳

function chgUrl(url) {

var timestamp = (new Date()).valueOf();

url = url.substring(0, 17);

if ((url.indexOf("&") >= 0)) {

url = url + "×tamp=" + timestamp;

} else {

url = url + "?timestamp=" + timestamp;

}

return url;

}

function refresh(obj) {

obj.src = "code.html";

}

</script>

</head>

<body>

验证码<input id="index_code" name="code" type="text" />

<img id="imgObj" alt="验证码" src="code.html" οnclick="javascript:changeImg();" />

<!-- <a href="" οnclick="changeImg()"οnclick="javascript:refresh(this);">换一张</a> -->

<input type="button" οnclick="javascript:changeImg();" value="看不清换一张">

<input type="hidden" value="123456" id="code"/>

</body>

</html>

后台

/**

* 用户验证码

* @author Administrator

*

*/

@Controller

public class CodeController {

private int width = 90;//定义图片的width

private int height = 20;//定义图片的height

private int codeCount = 4;//定义图片上显示验证码的个数

private int xx = 15;

private int fontHeight = 18;

private int codeY = 16;

char[] codeSequence = {

'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',

'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',

'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

@RequestMapping("/code")

public void getCode(HttpServletRequest req, HttpServletResponse resp)

throws IOException {

// 定义图像buffer

BufferedImage buffImg = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

//Graphics2D gd = buffImg.createGraphics();

//Graphics2D gd = (Graphics2D) buffImg.getGraphics();

Graphics gd = buffImg.getGraphics();

// 创建一个随机数生成器类

Random random = new Random();

// 将图像填充为白色

gd.setColor(Color.WHITE);

gd.fillRect(0, 0, width, height);

// 创建字体,字体的大小应该根据图片的高度来定。

Font font = new Font("Fixedsys", Font.BOLD, fontHeight);

// 设置字体。

gd.setFont(font);

// 画边框。

gd.setColor(Color.BLACK);

gd.drawRect(0, 0, width - 1, height - 1);

// 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。

gd.setColor(Color.BLACK);

for (int i = 0; i < 40; i++) {

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

gd.drawLine(x, y, x + xl, y + yl);

}

// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。

StringBuffer randomCode = new StringBuffer();

int red = 0, green = 0, blue = 0;

// 随机产生codeCount数字的验证码。

for (int i = 0; i < codeCount; i++) {

// 得到随机产生的验证码数字。

String code = String.valueOf(codeSequence[random.nextInt(62)]);

// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。

red = random.nextInt(255);

green = random.nextInt(255);

blue = random.nextInt(255);

// 用随机产生的颜色将验证码绘制到图像中。

gd.setColor(new Color(red, green, blue));

gd.drawString(code, (i + 1) * xx, codeY);

// 将产生的四个随机数组合在一起。

randomCode.append(code);

}

// 将四位数字的验证码保存到Session中。

HttpSession session = req.getSession();

System.out.println(randomCode);

session.setAttribute("code", randomCode.toString());

// 禁止图像缓存。

resp.setHeader("Pragma", "no-cache");

resp.setHeader("Cache-Control", "no-cache");

resp.setDateHeader("Expires", 0);

resp.setContentType("image/jpeg");

// 将图像输出到Servlet输出流中。

ServletOutputStream sos = resp.getOutputStream();

ImageIO.write(buffImg, "jpeg", sos);

sos.close();

}

/**********************************调到验证码**************************************/

@RequestMapping("/tocode")

public ModelAndView tologin(HttpServletRequest request,HttpServletResponse response) {

ModelAndView mav = new ModelAndView();

mav.setViewName("/user/code");

return mav;

}

}

Spring MVC 验证码相关推荐

  1. Spring MVC 中使用 Google kaptcha 验证码

    验证码是抵抗批量操作和恶意登录最有效的方式之一. 验证码从产生到现在已经衍生出了很多分支.方式.google kaptcha 是一个非常实用的验证码生成类库. 通过灵活的配置生成各种样式的验证码,并将 ...

  2. kaptcha 验证码在spring mvc 中的使用

    转自:http://ttaale.iteye.com/blog/808719 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的 ...

  3. Spring mvc 中使用 kaptcha 验证码

    2019独角兽企业重金招聘Python工程师标准>>> 生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的开源项目.使用Kaptc ...

  4. Java Web(11) Spring MVC 返回Json

    2019独角兽企业重金招聘Python工程师标准>>> 1. 首先是对Spring mvc 进行xml配置 <?xml version="1.0" enco ...

  5. Spring mvc-kaptcha 验证码

    2019独角兽企业重金招聘Python工程师标准>>> 生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的开源项目.使用Kaptc ...

  6. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用

    最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...

  7. 如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha

    如何使用recaptcha CAPTCHA是一个程序,可以生成人类可以通过但计算机程序" 不能 "通过的测试并对其进行评分. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用 ...

  8. 在Spring MVC Web应用程序中使用reCaptcha

    CAPTCHA是一种程序,可以生成人类可以通过的测试并对其进行评分,而计算机程序" 不能 "通过. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用户应在输入区域中书写文本. ...

  9. Spring MVC 文件上传 文件下载

    索引: 目录索引 参看代码 GitHub: pom.xml WebConfig.java index.jsp upload.jsp FileUploadController.java Files_Ut ...

最新文章

  1. 用C#实现支持gmail邮件发送
  2. PKUWC 2018 滚粗记
  3. Openssl搭建私有CA认证
  4. Java的深度:通过协方差暴露的API泄漏
  5. gcc学习(一)[第二版]
  6. 05 - 雷达的发展与应用
  7. 【线性系统理论】0.线性系统基本概念(1)
  8. Cypress Test
  9. Discuz仿魔客吧模板/素材资源站模板/包含DIY文件
  10. cmf php,php cmf
  11. 聚名企服商标注册流程及资料(2022新版新手教程)
  12. [组合计数] BZOJ 3505 [Cqoi2014]数三角形
  13. 又一块遮羞布被撕了,5G的发展还是得靠手机用户
  14. ios 自带录屏框架replayKit的使用
  15. Objective-C runtime机制(5)——iOS 内存管理
  16. 绿色数据中心空调设计 书评_书评:响应式设计工作流程
  17. Hexo博客页脚添加ICP备案号
  18. 20175227张雪莹 2018-2019-2 《Java程序设计》第五周学习总结
  19. H5, 遇到的 ios 兼容性问题
  20. NOIP2018 提高组游记

热门文章

  1. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波2 - 图像反转、对数变换
  2. windows上安装mysql5.7.24
  3. ES6学习笔记六(Iterator和for..of)
  4. Pandas CookBook -- 04选取数据子集
  5. SP和Fuction的关系
  6. centos7 时间设置
  7. Google推出“Google实验室” Ad Innovations
  8. keepalived mysql双主架构图_基于keepalived Mysql双主热备配置
  9. 全国计算机等级考试题库二级C操作题100套(第71套)
  10. 中文能用rsa加密吗_外文文献数据库能用中文词进行检索吗?