• JavaWeb、会话跟踪技术


    目录

    一、会话跟踪概述

    二、Cookie

    1、cookie的基本使用

    2、cookie原理

    3、cookie的使用细节

    对于存储中文可以使用URL编码、解码

    三、Session

    1、Session的基本使用

    2、Session的原理

    3、Session的使用细节

     四、Cookie和Session的区别

    五、登陆注册案例

    1、用户登录

    1、Dao/Mapper层

    2、Service层

    3、Web层

    2、记住密码

    3、注册功能

    1、Dao/Mapper层

    2、Service层

    3、Web层

    4、生成验证码

    5、校验验证码


    一、会话跟踪概述

    二、Cookie

    1、cookie的基本使用

    1. @WebServlet("/cookie")
    2. public class ServletDemo extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //发送cookie
    6. //1、创建cookie对象
    7. Cookie cookie = new Cookie("zhangsan","23");
    8. //2、发送cookie,response
    9. resp.addCookie(cookie);
    10. }
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. //接收cookie
    14. //1、获取cookie对象数组
    15. Cookie[] cookies = req.getCookies();
    16. //2、遍历cookie对象数组,获取需要的cookie数据
    17. for (Cookie cookie : cookies) {
    18. String name = cookie.getName();
    19. if ("zhangsan".equals(name)){
    20. String value = cookie.getValue();
    21. System.out.println(name + ":" + value );
    22. break;
    23. }
    24. }

    2、cookie原理

     Cookie的实现是基于HTTP协议,发送cookie时,响应头中会存放发送的cookie数据,所有的cookie会以键值对形式存放在响应头中,当浏览器在请求服务器资源时,会通过请求头cookie,把cookie的数据携带到服务器的资源中来获取请求数据

    3、cookie的使用细节

    对于存储中文可以使用URL编码、解码

    1. @WebServlet("/cookieE")
    2. public class ServletDemoEncoder extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //发送cookie
    6. //1、创建cookie对象
    7. String value = "张三";
    8. //URL编码
    9. value = URLEncoder.encode(value, "UTF-8");
    10. System.out.println("存储数据:" + value);
    11. Cookie cookie = new Cookie("username",value);
    12. //设置存活时间 一个星期
    13. cookie.setMaxAge(60*60*24*7);
    14. //2、发送cookie,response
    15. resp.addCookie(cookie);
    16. }
    17. @WebServlet("/cookieD")
    18. public class ServletDemoDecoder extends HttpServlet {
    19. @Override
    20. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    21. //接收cookie
    22. //1、获取cookie对象数组
    23. Cookie[] cookies = req.getCookies();
    24. //2、遍历cookie对象数组,获取需要的cookie数据
    25. for (Cookie cookie : cookies) {
    26. String name = cookie.getName();
    27. if ("username".equals(name)){
    28. //对接收到的cookie值进行解码
    29. String value = cookie.getValue();
    30. value = URLDecoder.decode(value, "UTF-8");
    31. System.out.println(name + ":" + value );
    32. break;
    33. }
    34. }
    35. }

    三、Session

    1、Session的基本使用

    1. @WebServlet("/demo1")
    2. public class SessionDemo1 extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //创建Session,存储数据
    6. HttpSession session = req.getSession();
    7. session.setAttribute("username","zhangsan");
    8. }
    9. @WebServlet("/demo2")
    10. public class SessionDemo2 extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    13. //获取Session数据
    14. HttpSession session = request.getSession();
    15. Object username = session.getAttribute("username");
    16. System.out.println(username);
    17. }

    2、Session的原理

     当客户端浏览器发送请求1,获取session时,第一次执行获取到的session对象会自动添加一个唯一标识,假设id为10,第一次执行时会对sessio对象封装数据,数据封装结束后,Tomcat会对请求1做出响应,当Tomcat发现这个请求1中获取了session,它会将这个session的id当作一个cookie发送给客户端浏览器,此时客户端浏览器就会接收到这个响应头,并将这个响应头存储到客户端浏览器的内存中,当这个客户端浏览器下一次发送请求2时,就会携带这个cookie头去访问另一个servlet,根据这个cookie头携带的id值,就会在Tomcat的内存中寻找是否有这个id值,如果没有就创建一个,如果存在就直接使用这个session对象,这样保证了在一次会话的两次请求之间获取到的session对象是同一个

    3、Session的使用细节

     四、Cookie和Session的区别

    五、登陆注册案例

    1、用户登录

    1、Dao/Mapper层

    1. public interface UserMapper {
    2. //根据用户名和密码查询用户对象
    3. User select(@Param("username") String username, @Param("password") String password);
    4. <select id="select" resultMap="userResultMap">
    5. select * from login where user_name=#{username} and password=#{password};
    6. select>

    2、Service层

    1. public static User selectUser(String username,String password){
    2. //1、加载mybatis核心配置文件获取SqlSessionFactory
    3. SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
    4. //2、开启SqlSession对象
    5. //SqlSession不能写在工具类,因为SqlSession代表用户与数据库的连接,如果放在工具类,则所有用户共用同一个连接
    6. //这样无法管理事务,使多个用户之间产生影响
    7. SqlSession sqlSession = sqlSessionFactory.openSession();
    8. //3、获取Mapper接口的代理对象
    9. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    10. //4、执行接口方法(执行SQL语句)
    11. User user = userMapper.select(username,password);
    12. //5、释放资源
    13. sqlSession.close();
    14. return user;
    15. }

    3、Web层

    1. @WebServlet("/login")
    2. public class loginServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. String username = req.getParameter("username");
    6. String password = req.getParameter("password");
    7. User user = UserService.selectUser(username, password);
    8. //如果查询到用户就跳转到商品页面
    9. if (user != null){
    10. //使用session共享数据,保证安全性
    11. HttpSession session = req.getSession();
    12. session.setAttribute("user",user);
    13. //页面跳转
    14. String contextPath = req.getContextPath();
    15. resp.sendRedirect(contextPath+"/select");
    16. }else {
    17. //如果没有查询到该账户跳转到登录失败页面
    18. //将用户信息存储到request域中
    19. req.setAttribute("login_msg","用户名或密码错误");
    20. //将信息转发回登陆页面
    21. req.getRequestDispatcher("/html/index.jsp").forward(req,resp);
    22. }
    23. }
    24. @Override
    25. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    26. this.doGet(req, resp);
    27. }
    28. }

    2、记住密码

    1. @WebServlet("/login")
    2. public class loginServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. String username = req.getParameter("username");
    6. String password = req.getParameter("password");
    7. String remember = req.getParameter("remember");
    8. User user = UserService.selectUser(username, password);
    9. //如果查询到用户就跳转到商品页面
    10. if (user != null){
    11. //是否勾选记住密码
    12. if ("1".equals(remember)){
    13. //勾选了开始存储cookie
    14. //创建cookie
    15. Cookie username_cookie = new Cookie("username",username);
    16. Cookie password_cookie = new Cookie("password",password);
    17. username_cookie.setMaxAge(60*60*24);
    18. password_cookie.setMaxAge(60*60*24);
    19. //发送cookie
    20. resp.addCookie(username_cookie);
    21. resp.addCookie(password_cookie);
    22. }
    23. //使用session共享数据,保证安全性
    24. HttpSession session = req.getSession();
    25. session.setAttribute("user",user);
    26. //页面跳转
    27. String contextPath = req.getContextPath();
    28. resp.sendRedirect(contextPath+"/select");
    29. }else {
    30. //如果没有查询到该账户跳转到登录失败页面
    31. //将用户信息存储到request域中
    32. req.setAttribute("login_msg","用户名或密码错误");
    33. //将信息转发回登陆页面
    34. req.getRequestDispatcher("/html/index.jsp").forward(req,resp);
    35. }
    36. }

     

    1. <tr>
    2. <td class="name">Usernametd>
    3. <td class="inputs">
    4. <%--cookie.键名称.value--%>
    5. <input name="username" type="text" id="username" value="${cookie.username.value}">
    6. td>
    7. tr>
    8. <tr>
    9. <td class="name">Passwordtd>
    10. <td class="inputs">
    11. <input name="password" type="password" id="password" value="${cookie.password.value}">
    12. td>
    13. tr>

    3、注册功能

    1、Dao/Mapper层

    1. public interface UserMapper {
    2. //根据用户名和密码查询用户对象
    3. User select(@Param("username") String username, @Param("password") String password);
    4. //注册用户
    5. int add(User user);
    6. //根据用户名查找是否存在
    7. User selectByName(@Param("username") String username);
    8. }
    9. <insert id="add" >
    10. insert into login(user_name,password,tel) values(#{username},#{password},#{tel});
    11. insert>
    12. <select id="selectByName" resultMap="userResultMap">
    13. select * from login where user_name=#{username};
    14. select>

    2、Service层

    1. public static boolean add(User user){
    2. //1、加载mybatis核心配置文件获取SqlSessionFactory
    3. SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
    4. //2、开启SqlSession对象
    5. //SqlSession不能写在工具类,因为SqlSession代表用户与数据库的连接,如果放在工具类,则所有用户共用同一个连接
    6. //这样无法管理事务,使多个用户之间产生影响
    7. SqlSession sqlSession = sqlSessionFactory.openSession();
    8. //3、获取Mapper接口的代理对象
    9. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    10. //先检查账户是否被注册
    11. //获取用户名
    12. String username = user.getUsername();
    13. //根据用户名判断账户是否存在
    14. User user1 = userMapper.selectByName(username);
    15. //如果用户名不存在
    16. if (user1 == null){
    17. //不存在就添加用户
    18. userMapper.add(user);
    19. sqlSession.commit();
    20. sqlSession.close();
    21. /*return true;*/
    22. }/*else {
    23. return false;
    24. }*/
    25. //增强逻辑
    26. return user1 == null;
    27. }

    3、Web层

    1. @WebServlet("/addUser")
    2. public class AddUserServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //1、接收用户名、密码和手机号
    6. String username = req.getParameter("username");
    7. String password = req.getParameter("password");
    8. String tel = req.getParameter("tel");
    9. User user = new User(username, password, tel);
    10. //调用方法查看用户名是否被注册
    11. boolean flag = UserService.add(user);
    12. if (flag){
    13. //没有被注册,跳转到登陆页面
    14. req.setAttribute("register_msg","注册成功请登录");
    15. req.getRequestDispatcher("/html/index.jsp").forward(req,resp);
    16. }else {
    17. //注册失败,已被注册
    18. req.setAttribute("register_msg","注册失败,账号已存在");
    19. req.getRequestDispatcher("/html/login.jsp").forward(req,resp);
    20. }
    21. }

    4、生成验证码

     

    通过验证码生成工具类生成验证码输出到页面

    1. @WebServlet("/check")
    2. public class CheckServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //使用方法
    6. //respose文档输出流,直接输出到页面
    7. ServletOutputStream os = resp.getOutputStream();
    8. String checkCode = CheckCodeUtils.outputVerifyImage(120, 50, os, 4);
    9. req.setAttribute("checkCode",checkCode);
    10. }
    11. @Override
    12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. this.doGet(req,resp);
    14. }
    15. }

     图片使用Servlet接收

    1. <tr>
    2. <td class="name">验证码td>
    3. <td class="inputs">
    4. <input name="check" type="text" id="check" placeholder="请输入验证码" style="width: 5vw;">
    5. <img class="check" id="checkimg" src="/jspcase/check" >
    6. <span ><a class="checkother" href="#" id="checks" >换一张a>span>
    7. <br>
    8. td>
    9. tr>

    添加JS使点击图片切换验证码

    1. var changeImg = document.getElementById("checks");
    2. changeImg.onclick = checkCode;
    3. function checkCode() {
    4. //由于浏览器缓存问题,要在更换的路径下添加参数才能展示新的验证码图片,添加时间毫秒值就可以不断刷新
    5. document.getElementById("checkimg").src ="/jspcase/check?"+ new Date().getMilliseconds();
    6. }
    7. //点击图片刷新
    8. document.getElementById("checkimg").onclick = function(){
    9. document.getElementById("checkimg").src ="/jspcase/check?"+ new Date().getMilliseconds();
    10. }

    5、校验验证码

     

    1. @WebServlet("/check")
    2. public class CheckServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //使用方法
    6. //respose文档输出流,直接输出到页面
    7. ServletOutputStream os = resp.getOutputStream();
    8. String checkCode = CheckCodeUtils.outputVerifyImage(120, 50, os, 4);
    9. //存Session
    10. HttpSession session = req.getSession();
    11. session.setAttribute("checkCode",checkCode);
    12. }
    13. @WebServlet("/addUser")
    14. //从Session获取生成的验证码
    15. HttpSession session = req.getSession();
    16. String checkCode = (String) session.getAttribute("checkCode");
    17. //先判断验证码是否正确
    18. //忽略大小写比较 equalsIgnoreCase
    19. if (!checkCode.equalsIgnoreCase(check)) {
    20. //验证码校验失败
    21. req.setAttribute("register_msg","验证码校验失败");
    22. req.getRequestDispatcher("/html/login.jsp").forward(req,resp);
    23. return;
    24. }
    25. //校验成功,向下判断

  • 相关阅读:
    PhalAPI学习笔记 ——— 第二章接口服务请求
    Linux 解决wine启动winedows程序无法显示中文
    1、网页结构
    shell 拒绝恶意连接脚本 centos7.x拒绝恶意连接脚本
    02 Spring_IOC 控制反转
    MybatisPlus实现乐观锁(实战)
    前端编译与优化(Javac,语法糖)
    Springboot毕业设计毕设作品,微信垃圾分类小程序系统设计与实现
    C语言数据结构-----单链表(无头单向不循环)
    区间dp打卡——能量向量 energy nacklace
  • 原文地址:https://blog.csdn.net/m0_56044262/article/details/126384252