web登录验证码生成

妖狐艹你老母 2024-02-19 18:08 121阅读 0赞

目的:实现在登录表单验证码的生成

声明:我是参考别人的例子,代码大部分也是引用的

原理:是在要显示验证码的地方用,它的src指向了另一个生成验证码的jsp页面(用controller的url指向一个jsp页面),在生成验证码jsp页面的java代码里生成一张验证码图片

代码里注释已经非常详情,这里就不做多说了!

提交表单的登录页面 login.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3. <html>
  4. <head>
  5. <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
  6. <title>登录</title>
  7. <%
  8. pageContext.setAttribute("APP_PATH",request.getContextPath());
  9. %>
  10. <script type="text/javascript">
  11. /* 刷新验证码 */
  12. function change_yanzhengma()
  13. {
  14. // 这个src也可以用相对路径
  15. // 这个flag=Math.random()很关键,作用是每次传的值不同,才可以实现<img>的src的局部刷新,没有这个src不会变,
  16. // 因为请求参数一样,浏览器不会重新请求,这里每次传的参数不一样,浏览器就会每次发出请求,实际上后台并没有接受flag这个参数
  17. document.getElementById("checkcode_img").src = "changeCode?flag="+Math.random();
  18. }
  19. function checkLoginInfo()
  20. {
  21. if (form1.userName.value == "" || form1.userName.value == null)
  22. {
  23. alert("用户名不能为空");
  24. form1.userName.focus();
  25. return false;
  26. }
  27. else if (form1.userCode.value == "" || form1.userCode.value == null)
  28. {
  29. alert("验证码不能为空");
  30. form1.yanzhengma.focus();
  31. return false;
  32. }
  33. return true;
  34. }
  35. </script>
  36. </head>
  37. <body>
  38. <%--想要用js验证表单,返回false就不提交,必须要 onsubmit="return functionName();" 少了 return 一样会提交--%>
  39. <form action="loginCheck" method="post" name="form1" onsubmit="return checkLoginInfo();">
  40. 请输入用户名:<input type="text" name="userName" id="userName"/>
  41. <br/>
  42. <%--src路径直接用controler指定的url,这个url是直接return一个jsp页面,那个页面没有边框只有图,直接显示在这里--%>
  43. <img title="刷新验证码" alt="刷新验证码" src="${APP_PATH}/changeCode" border="0" id="checkcode_img" onClick="change_yanzhengma();" />
  44. <br/>
  45. 请输入验证码:<input type="text" name="code" />
  46. <br/>
  47. <input type="submit" value="确认登录">
  48. <br/>
  49. <!-- 保存登录失败时显示给用户的提示信息 -->
  50. <span color="red">
  51. <%--回显完信息,立即将session信息删除,防止重新刷新页面还看到这条信息--%>
  52. ${sessionScope.loginError } <%session.removeAttribute("loginError"); %>
  53. </span>
  54. </form>
  55. </body>
  56. </html>

生成验证码的 jsp页面 changeCode.jsp

  1. <%@ page contentType="text/html;charset=gbk" language="java" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
  2. <%@ page import="java.io.OutputStream"%>
  3. <%-- 采用JPG格式的图片验证码 --%>
  4. <%--这里之所以用声明语句块,是因为这是一个方法,java代码块编译后是放到servlet类的方法里面,方法里面不可以再有方法,会报错。
  5. 而声明语句块是编译后在servlet类里方法外,作为成员变量,可以声明一个方法--%>
  6. <%!Color getRandColor(int fc, int bc) //随机生成图片中rgb的值
  7. {
  8. Random random = new Random();
  9. if (fc > 255)
  10. fc = 255;
  11. if (bc > 255)
  12. bc = 255;
  13. int r = fc + random.nextInt(bc - fc);
  14. int g = fc + random.nextInt(bc - fc);
  15. int b = fc + random.nextInt(bc - fc);
  16. return new Color(r, g, b);
  17. }
  18. %>
  19. <%
  20. try
  21. {
  22. response.setHeader("Pragma", "No-cache");
  23. response.setHeader("Cache-Control", "no-cache");
  24. response.setDateHeader("Expires", 0);
  25. int width = 75, height = 30;
  26. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  27. OutputStream os = response.getOutputStream();
  28. Graphics g = image.getGraphics(); // 画笔
  29. Random random = new Random();
  30. // 设置画笔的颜色
  31. g.setColor(getRandColor(200, 250));
  32. // 画图,生成干扰图片
  33. g.fillRect(0, 0, width, height);
  34. //字体等样式
  35. g.setFont(new Font("Times New Roman", Font.PLAIN, 25));
  36. g.setColor(getRandColor(160, 200));
  37. //生成图像内部的干扰线条
  38. for (int i = 0; i < 155; i++)
  39. {
  40. int x = random.nextInt(width);
  41. int y = random.nextInt(height);
  42. int xl = random.nextInt(12);
  43. int yl = random.nextInt(12);
  44. //绘制干扰线条
  45. g.drawLine(x, y, x + xl, y + yl);
  46. }
  47. String sRand = "";
  48. //生成4个随机的、有彩色的验证码
  49. for (int i = 0; i < 4; i++)
  50. {
  51. //生成一位验证码的值
  52. String rand = String.valueOf(random.nextInt(10));
  53. sRand += rand;
  54. g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
  55. //把生成的验证码值画进图对象里,后面两个参数是生成的位置
  56. g.drawString(rand, 14 * i + 11, 23);
  57. }
  58. session.setAttribute("code_inSession", sRand);
  59. g.dispose();
  60. //生成JPEG格式的图片验证码
  61. ImageIO.write(image, "gif", os);
  62. os.flush();
  63. os.close();
  64. os = null;
  65. // 用来将缓冲区的数据立即输出到浏览器当中
  66. response.flushBuffer();
  67. /* 两句关键代码 */
  68. out.clear();
  69. out = pageContext.pushBody();
  70. }
  71. catch (IllegalStateException e)
  72. {
  73. System.out.println(e.getMessage());
  74. e.printStackTrace();
  75. }
  76. %>

controller部分代码

  1. // 验证码登录页面
  2. @RequestMapping("/loginPage")
  3. public String loginPage1(){
  4. return "login_code/login";
  5. }
  6. // 更新验证码,换验证码
  7. @RequestMapping("/changeCode")
  8. public String checkcode(){
  9. return "login_code/changeCode";
  10. }
  11. // 验证验证码是否正确
  12. @RequestMapping("/loginCheck")
  13. public String loginCheck(String username,String code, HttpServletRequest request,HttpServletResponse response){
  14. HttpSession session = request.getSession();
  15. // 获取session里的验证码,然后删除
  16. String sessionCode = (String)session.getAttribute("code_inSession");
  17. session.removeAttribute("code_inSession");
  18. if (!code.equals(sessionCode))
  19. {
  20. // 验证码错误
  21. session.setAttribute("loginError", "验证码错误");
  22. // 重定向,redirect: 后面跟controller的url路径,不同controller也可以,记得要加 /
  23. // 请求转发,forward: 用法一样 用重定向是防止表单重复提交的简单解决方法
  24. return "redirect:/loginPage";
  25. }else
  26. {
  27. //用户名密码验证
  28. return "redirect:/main";
  29. }
  30. }
  31. @RequestMapping("/main")
  32. public String mainPage(){
  33. return "login_code/main";
  34. }

最后给一个简单的验证通过页面 main.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
  5. <title>main页面</title>
  6. </head>
  7. <body>
  8. 验证成功!
  9. </body>
  10. </html>

发表评论

表情:
评论列表 (有 0 条评论,121人围观)

还没有评论,来说两句吧...

相关阅读

    相关 web登录验证生成

    目的:实现在登录表单验证码的生成 声明:我是参考别人的例子,代码大部分也是引用的 原理:是在要显示验证码的地方用<img>,它的src指向了另一个生成验证码的jsp页面(用

    相关 登录验证

    验证码的作用是区分人与机器,防止机器刷数据; 验证码的验证分了两步,一步是请求获取验证码,一步是前台传的验证码与后台的验证码进行对比判断后进行后续操作; 在MyEclips