会话跟踪技术(Cookie&Session)

会话跟踪技术(Cookie&Session)

会话: 用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

会话跟踪: 一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

但是HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。

客户端会话跟踪技术:Cookie

Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问

Cookie基本使用
发送Cookie
  • 创建Cookie对象,设置数据

    java 复制代码
    Cookie cookie = new Cookie("key","value");
  • 发送Cookie到客户端:使用response对象

    java 复制代码
    response.addCookie(cookie);
获取Cookie
  • 获取Cookie数组

    java 复制代码
    Cookie[] cookies = request.getCookies();
  • 遍历数组

    java 复制代码
    for (Cookie cookie cookies)
  • 获取数据

    java 复制代码
    //3.获取数据
    String name cookie.getName();
    if("username".equals(name)){
    	String value = cookie.getvalue();
    }
Cookie原理

Cookiel的实现是基于HTTP协议的

  • 响应头:set-cookie
  • 请求头:cookie

流程图:

注意: Cookie并不是请求时仅带了一组Cookie数据,而是将所有的Cookie值都发送过来,因此需要通过遍历得到相应的Cookie数据

Cookie使用细节
Cookie存活时间
  • 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
  • setMaxAge(int seconds):设置Cookie存活时间
    • 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
    • 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
    • 零:删除对应Cookie
java 复制代码
Cookie cookie = new Cookie("key","value");
//设置存活附间·1周7天
cookie.setMaxAge(60*60*24*7);
//2.发送Cookie,response
response.addCookie(cookie);
Cookie存储中文
  • Cookie不能直接存储中文,不然会报错
  • 如需要存储,则需要进行转码:URL编码(见之前文章HTTP)

服务端会话跟踪技术:Session

服务端会话跟踪技术:将数据保存到服务端。JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能

Session基本使用
  • 获取Session对象

    java 复制代码
    HttpSession session = request.getSession();
  • Session对象功能:

    • void setAttribute(String name,Object o):存储数据到session域中
    • Object getAttribute(String name):根据key,获取值
    • void removeAttribute(String name):根据key,删除该键值对
java 复制代码
// 在demo1的doGet方法中存储数据
//1.获取Session对象
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("username", "zs");

// 在demo2的doGet方法中存储数据
//1.获取Session对象
HttpSession session = request.getSession();
//2.获取数据
Object username = session.getAttribute("username");
System.out.println(username);

先访问demo1再访问demo2,可以发现session对象数据保存成功。

Session原理

Session是基于Cookie实现的;

在同一个客户访问过程中,在创建Session会话是时,会给它分配一个Session id,然后服务器将信息返回给用户时,会在Session前面加一个set-cookis的表头,然后客户在下一次请求会将Session id的信息带回,这样下次创建Session时,会根据id去查找Session,这样就做到了一个客户对应一个Session。

Session使用细节
  • Session钝化、活化:

    • 服务器重启后,Session中的数据是否还在?答案:在
    • 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中(文件:SESSIONS.ser)
    • 活化:再次启动服务器后,从文件中加载数据到Session中
  • Seesion销毁:

    • 默认情况下,无操作,30分钟自动销毁,也支持配置时间:

      xml 复制代码
      <session-config>
      <session-timeout>30</session-timeout>
      </session-config>
    • 调用Session对象的invalidate()方法:主动销毁,没错,就是自己毁灭自己。

小结

  • Cookie和Session都是来完成一次会话内多次请求间数据共享的
  • 区别:
    • 存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端
    • 安全性:Cookie不安全,Session安全
    • 数据大小:Cookie最大3KB,Session无大小限制
    • 存储时间:Cookie可以长期存储,Session默认30分钟
    • 服务器性能:Cookie不占服务器资源,Session占用服务器资源

案例

需求说明:

  • 完成用户登录功能,如果用户勾选"记住用户",则下次访问登录页面自动填充用户名密码

    java 复制代码
    //仅提供部分后端代码:
    //DAO层,提供UserMapper接口,使用MyBatis,使用注解的方式提供SQL语句
    //Service层,提供UserService类,实现对象的获取
    //Web层,提供LoginServlet类,这里仅提供该层逻辑代码
    //doGet方法:
    //1.获取用户名和密码
    String username = request.getParameter(name:"username");
    	String password = request.getParameter(name:"password");
    String remember = request.getParameter("remember");
    //2.调用service查询
    User user = service.Login(username,password);
    //3.判断
    if(user != null){
        //判断用户是否匀幻选记住我
    	if ("1".equals(remember)){
    		//匀选了,发送Cookie
    		//1.创Cookie对象
    		Cookie c_username = new Cookie(name:"username",username);
    		Cookie c_password = new Cookie(name:"password",password);
    		//设置℃ookie的存污附/间
    		c_username.setMaxAge(60*60*24*7);
            c_password.setMaxAge(60*60*24*7);
    		//2.发送
    		response.addCookie(c_username);
    		response.addCookie(c_password);
            // 页面中使用${cookie.key.value
            //key指存储在cookie中的键名称
    	}
    	//登录成功,跳转到查询所有的BrandServlet
    	//将登陆成功后user对象,存储到session
    	HttpSession session = request.getSession();
    		session.setAttribute("user",user);
    	String contextPath = request.getContextPath();
    	response.sendRedirect(contextPath+"/selectAllServlet");
    }else{
        //登录失败,
    	//存储错误信息到request
    	request.setAttribute("Login._msg","用户名或密码错误");
    	//跳转到login.jsp
    	request.getRequestDispatcher("/Login.jsp").forward(request,response);
    }
  • 完成注册功能

    java 复制代码
    //仅提供部分后端代码:
    //DAO层,提供UserMapper接口,提供添加的方法,使用MyBatis,使用注解的方式提供SQL语句
    //Service层,提供UserService类,判断用户是否存在,不存在则添加用户
    //Web层,提供RegisterServlet类,这里仅提供该层逻辑代码
    //doGet方法:
    //1.获取用户名和密码数据
    String username = request.getParameter(name:"username");
    String password = request.getParameter(name:"password");
    User user = new User();
    user.setUsername(username);
    user.setPassword(password);I
    //2.调用service注册
    boolean flag = service.register(user);
    //3.判断注册成功与否
    if(flag){
    	//注册功能,跳转登陆页面
    
    	request.setAttribute("register_msg","注册成功,请登录");
    	request.getRequestDispatcher("/Login.jsp").forward(request,response);
    }else {
        //注册失败,跳转到注册页面
    	request.setAttribute("register_msg","用户名已存在");
    	request.getRequestDispatcher("/register.jsp").forward(request,response);
    }

如果觉得文章对您有帮助,请帮忙点赞或者收藏,如果在文章中发现什么错误或不准确的地方,欢迎与我交流。

相关推荐
杨荧1 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
XiaoLeisj12 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
尢词16 小时前
SpringMVC
java·spring·java-ee·tomcat·maven
阑梦清川19 小时前
JavaEE进阶---第一个SprintBoot项目创建过程&&&我的感受
java·java-ee·springboot
移民找老国20 小时前
加拿大移民新风向
java-ee·maven·phpstorm·visual studio code·nio
琪露诺大湿21 小时前
JavaEE-多线程初阶(4)
java·开发语言·jvm·java-ee·基础·1024程序员节·原神
细心的莽夫1 天前
JavaWeb学习笔记
java·开发语言·笔记·学习·java-ee·web
yang_shengy2 天前
【JavaEE】认识进程
java·开发语言·java-ee·进程
听潮阁3 天前
【SpringCloud详细教程】-01-一文了解微服务
开发语言·spring boot·spring cloud·servlet·java-ee·mybatis