Spring MVC 验证码

页面

<%@ 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;

}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值