Java会话跟踪 Cookie Session

Java会话跟踪(Cookie、Session)

会话跟踪

  • 会话:用户打开了浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以有包含多次请求和响应
  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求中共享数据
  • HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享
  • 实现方式:
    1. 浏览器:Cookie
    2. 服务器:Session

Cookie

Cookie基本使用

  • Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
  • Cookie 基本使用
    1. 发送Cookie
    // 创建Cookie对象,设置数据
    Cookie cookie = new Cookie("key", "values");
    
    // 发送Cookie到客户端:使用response对象(servlet)
    response.addCookie(cookie);
    
    1. 接受Cookie
    // 获取客户端携带的所有Cookie,使用request对象
    Cookie[] cookies = request.getCookies();
    
    // 遍历数组,获取每一个Cookie对象:for
    // 使用Cookie对象方法获取数据
    cookie.getName();
    cookie.getValue();
    

Cookie基本原理

假设客户端发送第一次请求后,服务器做出响应,并在Cookie中存储了数据,将数据放在响应头中(set-cookie:values)返回给客户端,客户端接受到响应后,将Cookie数据存储到本地。

当客户端发送第二次请求时,会在请求头中(cookie:values)将本地存储的Cookie数据返还给服务器,服务器识别数据后,做出相关的处理。

这样就完成了一次会话间多次请求的数据共享。

Cookie使用细节

  • Cookie存活时间
    1. 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
    2. setMaxAge(int seconds):设置Cookie存活时间
      1. 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
      2. 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
      3. 零:删除对应的Cookie
      
  • Cookie存储中文
    1. Cookie不能直接存储中文
    2. 如需要存储,则需要进行转码:URL编码
      // 发送Cookie URL编码
      String schoolName = "安徽理工大学";
      schoolName = URLEncoder.encoder(schoolName, "UTF-8");
      Cookie cookie = new Cookie("schoolName", schoolName);
      response.addCookie(cookie);
      
      // 接受Cookie URL解码
      Cookie[] cookies = request.getCookies();
      for(Cookie cookie : cookies) {
          String schoolName = cookie.getName();
          if("schoolName".equals(schoolName){
              String value = cookie.getValue();
              values = URLDecoder.decode(value, "UTF-8");
          }
      }
      
      

Session

Session的基本使用

  • 服务端跟踪技术:将数据存储在服务端
  • JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能
  • 使用:
    1.获取Session对象
    HttpSession session = request.getSession();
    
    2.Session的功能
    void setAttribute(String name, Object O): 存储数据到session域中
    Object getAttribute(String name): 根据key,获取值
    void removeAttribute(String name):根据key,删除对应的键值对
    

Session基本原理

Session是基于Cookie实现的,假设当浏览求发送第一次请求时,服务器接受到请求,生成session,并且给其分配个id,这个session的id会被存储到响应头中(set-cookie:JESSIONID=id),返回给客户端。

当浏览器发送第二次请求时,会携带本地cookie一并发给客户端,其中请求头中就包含上次请求的session的id(cookie:JESSIONID=id),服务器接受到请求信息,进行识别,并做出响应。

这样服务器就能是被2次请求是否用的是一个session,如果是一个,就完成了一次会话的多次请求间的数据共享。

Seesion使用细节

  • Session钝化、活化:
    • 服务器重启后,Session中的数据是否还在?
    1. 钝化:在服务器正常关闭后,tomcat会自动将Session数据写入硬盘的文件中
    2. 活化:再次启动服务器后,从文件加载数据到Session中
  • Session销毁
    1. 默认情况下,无操作,30分钟后自动销毁
      <!-- 对于这个销毁时间,是可以通过配置进行修改的(在项目的web.xml文件中配置) -->
      <session-config>
          <session-timeout>100</session>
      </session-config>
      
      <!-- 如果没有配置,这30分钟是写死的,默认值是在Tomcat中web.xml配置文件中写死的 -->
      
    2. 调用Session对象的invalidate()方法

总结

  • Cookie和Session都是来完成一次会话内多次请求间数据共享的
  • 区别:
    • 存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端
    • 安全性:Cookie不安全,Session安全
    • 数据大小:Cookie最大3KB,Session无大小限制
    • 存储时间:Cookie可以长时间存储,Session默认30分钟
    • 服务器性能:Cookie不占用服务器资源,Session占用服务器资源
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是示例Java代码实现cookiesession实现登录的功能: ``` import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/login") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO: 从请求对象中获取用户名和密码参数 String username = request.getParameter("username"); String password = request.getParameter("password"); // TODO: 校验用户名和密码是否正确 if ("user".equals(username) && "password".equals(password)) { // 登录成功 HttpSession session = request.getSession(true); // 创建或者获取会话对象 session.setMaxInactiveInterval(60 * 60 * 2); // 设置会话有效期为2小时 session.setAttribute("username", username); // 在会话中存储用户信息 // 创建一个cookie存储sessionId, 并设置有效期为2小时 Cookie cookie = new Cookie("sessionId", session.getId()); cookie.setMaxAge(60 * 60 * 2); response.addCookie(cookie); // TODO: 登录成功后跳转到主页 response.sendRedirect("/index.jsp"); } else { // 登录失败 response.getWriter().write("Username or password is incorrect!"); } } } ``` 在以上代码中,我们通过HttpServletRequest对象从请求中获取用户名和密码参数,然后校验用户名和密码是否正确。如果正确,就创建一个新的HttpSession对象,并在其中存储用户信息,并将sessionId存储在Cookie中。之后,将sessionId返回给客户端,客户端会自动将其存储在浏览器中。登录成功之后会自动跳转到主页。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值