Cookie和Session-学习笔记04【Session之验证码案例】

分手后的思念是犯贱 2022-10-29 13:26 209阅读 0赞
  • Java后端 学习路线 笔记汇总表【黑马程序员】
  1. Cookie和Session-学习笔记01【Cookie_快速入门、Cookie_细节】
  2. Cookie和Session-学习笔记02【Cookie案例、JSP改造Cookie案例】
  3. Cookie和Session-学习笔记03【Session快速入门、Session细节】
  4. Cookie和Session-学习笔记04【Session之验证码案例】

目录

第7节 Session之验证码案例

案例_验证码_需求&分析

案例_验证码_代码实现

login.jsp页面效果

将验证码存入session

案例_验证码_细节处理

细节处理1:美化页面

细节处理2:一次性 验证码

代码总览

案例效果

代码1-login.jsp

代码2-LoginServlet.java

代码3-CookieTest.java

代码4-CheckCodeServlet.java

代码5-success.jsp


第7节 Session之验证码案例

案例_验证码_需求&分析

  1. 案例需求:
    1. 访问带有验证码的登录页面login.jsp
    2. 用户输入用户名,密码以及验证码。
      * 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误;
      * 如果验证码输入有误,跳转登录页面,提示:验证码错误;
      * 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您。
  2. 分析:…

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 登录案例

案例_验证码_代码实现

login.jsp页面效果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 1

将验证码存入session

20210215122557694.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 3 20210215123257171.png 20210215123312191.png

20210215123330166.png

案例_验证码_细节处理

细节处理1:美化页面

20210215123510358.png

细节处理2:一次性 验证码

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 4

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 5

代码总览

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 6

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 7

案例效果

用户名:zhangsan、密码:123

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 8

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk0OTEzNQ_size_16_color_FFFFFF_t_70 9

20210215124842898.png

代码1-login.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>login</title>
  5. <script>
  6. window.onload = function () {
  7. document.getElementById("img").onclick = function () {
  8. this.src = "/day16/checkCodeServlet?time=" + new Date().getTime();
  9. }
  10. }
  11. </script>
  12. <style>
  13. div {
  14. color: red;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <form action="/day16/loginServlet" method="post">
  20. <table>
  21. <tr>
  22. <td>用户名</td>
  23. <td><input type="text" name="username"></td>
  24. </tr>
  25. <tr>
  26. <td>密码</td>
  27. <td><input type="password" name="password"></td>
  28. </tr>
  29. <tr>
  30. <td>验证码</td>
  31. <td><input type="text" name="checkCode"></td>
  32. </tr>
  33. <tr>
  34. <td colspan="2"><img id="img" src="/day16/checkCodeServlet"></td>
  35. </tr>
  36. <tr>
  37. <td colspan="2"><input type="submit" value="登录"></td>
  38. </tr>
  39. </table>
  40. </form>
  41. <div>
  42. <%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%>
  43. </div>
  44. <div>
  45. <%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error") %>
  46. </div>
  47. </body>
  48. </html>

代码2-LoginServlet.java

  1. package cn.itcast.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. @WebServlet("/loginServlet")
  10. public class LoginServlet extends HttpServlet {
  11. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. //1.设置request编码
  13. request.setCharacterEncoding("utf-8");
  14. //2.获取参数
  15. String username = request.getParameter("username");
  16. String password = request.getParameter("password");
  17. String checkCode = request.getParameter("checkCode");
  18. //3.先获取生成的验证码
  19. HttpSession session = request.getSession();
  20. String checkCode_session = (String) session.getAttribute("checkCode_session");
  21. //删除session中存储的验证码
  22. session.removeAttribute("checkCode_session");
  23. //3.先判断验证码是否正确
  24. if (checkCode_session != null && checkCode_session.equalsIgnoreCase(checkCode)) {
  25. //忽略大小写进行比较
  26. //验证码正确
  27. //判断用户名和密码是否一致
  28. if ("zhangsan".equals(username) && "123".equals(password)) {//需要调用UserDao查询数据库
  29. //登录成功
  30. //存储信息,用户信息
  31. session.setAttribute("user", username);
  32. //重定向到success.jsp
  33. response.sendRedirect(request.getContextPath() + "/success.jsp");
  34. } else {
  35. //登录失败
  36. //存储提示信息到request
  37. request.setAttribute("login_error", "用户名或密码错误");
  38. //转发到登录页面
  39. request.getRequestDispatcher("/login.jsp").forward(request, response);
  40. }
  41. } else {
  42. //验证码不一致
  43. //存储提示信息到request
  44. request.setAttribute("cc_error", "验证码错误");
  45. //转发到登录页面
  46. request.getRequestDispatcher("/login.jsp").forward(request, response);
  47. }
  48. }
  49. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  50. this.doPost(request, response);
  51. }
  52. }

代码3-CookieTest.java

  1. package cn.itcast.cookie;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.net.URLDecoder;
  10. import java.net.URLEncoder;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Date;
  13. /**
  14. * 在服务器中的Servlet判断是否有一个名为lastTime的cookie
  15. * 1. 有:不是第一次访问
  16. * 1. 响应数据:欢迎回来,您上次访问时间为:2018年6月10日11:50:20
  17. * 2. 写回Cookie:lastTime=2018年6月10日11:50:01
  18. * 2. 没有:是第一次访问
  19. * 1. 响应数据:您好,欢迎您首次访问
  20. * 2. 写回Cookie:lastTime=2018年6月10日11:50:01
  21. */
  22. @WebServlet("/cookieTest")
  23. public class CookieTest extends HttpServlet {
  24. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  25. //设置响应的消息体的数据格式以及编码
  26. response.setContentType("text/html;charset=utf-8");
  27. //1.获取所有Cookie
  28. Cookie[] cookies = request.getCookies();
  29. boolean flag = false;//没有cookie为lastTime
  30. //2.遍历cookie数组
  31. if (cookies != null && cookies.length > 0) {
  32. for (Cookie cookie : cookies) {
  33. //3.获取cookie的名称
  34. String name = cookie.getName();
  35. //4.判断名称是否是:lastTime
  36. if ("lastTime".equals(name)) {
  37. //有该Cookie,不是第一次访问
  38. flag = true;//有lastTime的cookie
  39. //设置Cookie的value
  40. //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
  41. Date date = new Date();
  42. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
  43. String str_date = sdf.format(date);
  44. System.out.println("编码前:" + str_date);
  45. //URL编码
  46. str_date = URLEncoder.encode(str_date, "utf-8");
  47. System.out.println("编码后:" + str_date);
  48. cookie.setValue(str_date);
  49. //设置cookie的存活时间
  50. cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
  51. response.addCookie(cookie);
  52. //响应数据
  53. //获取Cookie的value,时间
  54. String value = cookie.getValue();
  55. System.out.println("解码前:" + value);
  56. //URL解码:
  57. value = URLDecoder.decode(value, "utf-8");
  58. System.out.println("解码后:" + value);
  59. response.getWriter().write("<h1>欢迎回来,您上次访问时间为:" + value + "!</h1>");
  60. break;
  61. }
  62. }
  63. }
  64. if (cookies == null || cookies.length == 0 || flag == false) {
  65. //没有,第一次访问
  66. //设置Cookie的value
  67. //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
  68. Date date = new Date();
  69. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
  70. String str_date = sdf.format(date);
  71. System.out.println("编码前:" + str_date);
  72. //URL编码
  73. str_date = URLEncoder.encode(str_date, "utf-8");
  74. System.out.println("编码后:" + str_date);
  75. Cookie cookie = new Cookie("lastTime", str_date);
  76. //设置cookie的存活时间
  77. cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
  78. response.addCookie(cookie);
  79. response.getWriter().write("<h1>您好,欢迎您首次访问!</h1>");
  80. }
  81. }
  82. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  83. this.doPost(request, response);
  84. }
  85. }

代码4-CheckCodeServlet.java

  1. package cn.itcast.servlet;
  2. import javax.imageio.ImageIO;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.awt.*;
  9. import java.awt.image.BufferedImage;
  10. import java.io.IOException;
  11. import java.util.Random;
  12. @WebServlet("/checkCodeServlet")
  13. public class CheckCodeServlet extends HttpServlet {
  14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. int width = 100;
  16. int height = 50;
  17. //1.创建一对象,在内存中图片(验证码图片对象)
  18. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  19. //2.美化图片
  20. //2.1 填充背景色
  21. Graphics g = image.getGraphics();//画笔对象
  22. g.setColor(Color.PINK);//设置画笔颜色
  23. g.fillRect(0, 0, width, height);
  24. //2.2画边框
  25. g.setColor(Color.BLUE);
  26. g.drawRect(0, 0, width - 1, height - 1);
  27. String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
  28. //生成随机角标
  29. Random ran = new Random();
  30. StringBuilder sb = new StringBuilder();
  31. for (int i = 1; i <= 4; i++) {
  32. int index = ran.nextInt(str.length());
  33. //获取字符
  34. char ch = str.charAt(index);//随机字符
  35. sb.append(ch);
  36. //2.3写验证码
  37. g.drawString(ch + "", width / 5 * i, height / 2);
  38. }
  39. String checkCode_session = sb.toString();
  40. //将验证码存入session
  41. request.getSession().setAttribute("checkCode_session", checkCode_session);
  42. //2.4画干扰线
  43. g.setColor(Color.GREEN);
  44. //随机生成坐标点
  45. for (int i = 0; i < 10; i++) {
  46. int x1 = ran.nextInt(width);
  47. int x2 = ran.nextInt(width);
  48. int y1 = ran.nextInt(height);
  49. int y2 = ran.nextInt(height);
  50. g.drawLine(x1, y1, x2, y2);
  51. }
  52. //3.将图片输出到页面展示
  53. ImageIO.write(image, "jpg", response.getOutputStream());
  54. }
  55. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  56. this.doPost(request, response);
  57. }
  58. }

代码5-success.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h1><%=request.getSession().getAttribute("user")%>,欢迎您</h1>
  8. </body>
  9. </html>

加油~ ヾ(◍°∇°◍)ノ゙

发表评论

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

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

相关阅读

    相关 cookiesession学习

        cookie和session其实就是保存用户信息,在他们访问一个网站时,服务器端能知道这是一个合法注册用户。     cookie的话,就是将用户信息保存在用户的客户