会话跟踪学习笔记

7 阅读7分钟

什么是会话

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

  1. 从浏览器发出请求到服务端,服务端再响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了
  2. 会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着。
  3. 浏览器和服务器就可以继续使用这个会话进行请求发送和响应,上述的整个过程被称为会话。

会话跟踪

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

  1. 服务器会收到多个请求,这多个请求可能来自多个浏览器
  2. 服务器需要用来识别请求是否来自同一个浏览器。
  3. 服务器用来识别浏览器的过程,这个过程就是会话跟踪。
  4. 服务器识别浏览器后,就可以在同一个会话中多次请求之间来共享数据。

一个会话中的多次请求为什么要共享数据呢?有了这个数据共享功能后能实现哪些功能呢?

  • 购物车:加入购物车和去购物车结算是两次请求,但是后次请求要想展示前一次请求所添加的商品,就需要用到数据共享。
  • 页面展示用户登录信息:很多网站,登陆后访问多个功能发送多次请求后,浏览器上都会有当前登录用户的信息【用户名】
  • 网站登录页面的免登录功能:当用户登录成功后,勾选【自动登录】按钮后,下次再登录的时候,网站就会自动填充用户名和密码,简化用户的登录操作,多次登录就会有多次请求,他们之间页涉及到共享数据。
  • 登陆页面的验证码功能:获取验证码和输入验证码点击登录也是两次请求,这两次请求的数据之间要进行对比,相同则允许登录,不同则拒绝登录,该功能的实现也需要在同一次会话中共享数据。

为什么现在浏览器和服务器不支持数据共享?

  • 浏览器和服务器之间使用的是HTTP请求来进行数据传输
  • HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求
  • HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响
  • 请求与请求之间独立后,就无法实现多次请求之间的数据共享

如何实现会话跟踪?具体方案:

  1. 客户端会话跟踪技术:Cookie
  2. 服务端会话跟踪技术:Session 这两个技术都可以实现会话跟踪,他俩之间最大的区别:Cookie是存储在浏览器端而Session是存储来服务器端

Cookie

概念

Cookie是客户端会话技术,将数据保存到客户端电脑的文本文件中,以后每次请求都携带cookie数据进行访问。

Cookie的基本使用

对于Cookie的使用主要分为创建Cookie和获取Cookie

创建Cookie

Cookie cookie = new Cookie("key","value");

发送Cookie对象到客户端

response.addCookie(cookie);

获取Cookie

Cookie[] cookies = request.getCookies();\获取客户端携带的所有Cookie,使用request对象。遍历数组,获取每一个Cookie对象

使用Cookie对象方法获取数据

cookie.getName();

cookie.getValue();

示例

  1. 在CookieSetServlet中存入cookie信息,然后重定向success.jsp,提示保存cookie成功
  2. 在CookieGetServlet中获取cookie信息

CookieSetServlet代码

(首先右键项目NEW选择Servlet写好路径和名字)

package 路径;
import 导入依赖包;
...

@WebServlet("/Servlett名字")
public class CookieSetServlet extends HttpServlet{ protected void doGet(HttpServletRequest request,HttpServletResponse response) throws servletException,IOException{
//TODO Auto-generated method stub
//创建用户名Cookie
Cookie nameCookie=new Cookie("username","zs");
//发送Cookie
response.addCookie(nameCookie);
//跳转到success.jsp,提示cookie保存成功
/**

* 此处,使用response.sendRedirect("*.jsp")方法,进行页面跳转:

* 1.会丢失request作用域中保存的信息

* 2.浏览器地址栏的地址会变为新的地址:

* http://localhost:8080/trackWeb/cookie.jsp

* request.getContextPath()用于获取项目访问的web路径:

* http://localhost:8080/trackWeb

*/

response.sendRedirect(request.getContextPath()+"/success.jsp");

}

}

CookieGetServlet代码

(首先右键项目NEW选择Servlet写好路径和名字)

package 路径;
import 导入依赖包;
...

@WebServlet("/Servlett名字")
public class CookieSetServlet extends HttpServlet{ protected void doGet(HttpServletRequest request,HttpServletResponse response) throws servletException,IOException{
    //从request中,获取Cookie数组
    Cookie[] cookieArr=request.getCookies();
    for(Cookie cookie : cookieArr) {
    System.out.println("name:"+cookie.getName()+",value:"+cookie.getvalue());
    }
  }
}

Success.jsp代码

...(其实就一个标签写个保存成功就行)

Cookie持久化存储

语法

SetMaxAge(int seconds)

参数

  1. 正数;将Cookie写入浏览器所在的电脑的硬盘,持久化存储,到时间自动删
  2. 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
  3. 0:删除对应Cookie

设置Cookie存活时间代码

//创建用户名Cookie
Cookie nameCookie=new Cookie("username","zs");
//设置存活时间为7天
nameCookie.setMaxAge(7*24*60*60);//单位是秒

Session

Session使用步骤 1.使用request对象获取Session对象

HttpSession session=request.getSession();

2.Session对象提供的功能

(1)存储数据到session域中:

void  setAttribute(String name,Object 0)

(2)根据key,获取值

Object getAttribute(String name)

(3)根据key,删除键值对

void removeAttribute(String name)

需求:在一个Servlet中往Session中存入数据,在另一个Servlet中获取Session中存入的数据

  1. 创建名为SessionSetServlet的Servlet类,获取Session对象并存储到session中
  2. 创建名为SessionGetServlet的Servlet类,获取Session对象中存储的数据
  3. 启动测试

SessionSetServlet代码

package 路径......;
import 引入依赖包......;
...
@webServlet("/SessionSetServlet")
public class SessionSetServlet extends HttpServlet{
    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
    //获取session对象

HttpSession session =request.getSession();

//存储数据到session

session.setAttribute("userName", "wangle");

}

}

SessionGetservlet代码

package 路径......;
import 引入依赖包......;
...
@WebServlet("/SessionGetServlet")

public class SessionGetServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取session对象

HttpSession session =request.getSession();

//获取值

String userName=(String)session.getAttribute("userName");

System.out.println("UserName is"+userName);

}

}

启动服务器后在网址访问SessionSetServlet,将数据存入session

再访问SessionGetServlet,获取数据。数据就会显示在控制台

Session的钝化和活化

钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中

钝化的数据路径为:

apache-tomcat-9.0.71\work\Catalina\localhost\项目名\SESSIONS.ser

活化:再次启动服务器后,从文件中加载数据到Session中,数据加载到Session中后,路径中的SESSION.ser就会被删除掉

小结

  1. session数据存储在服务端,服务器重启后,session数据会被保存
  2. 浏览器被关闭启动后,重新建立的连接就已经是一个全新的会话,获取的session数据也是一个新的对象
  3. session的数据要想共享,浏览器不能关闭,所以session数据不能长期保存
  4. cookie是存储在客户端,是可以长期保存的

Session销毁

session的销毁有两种方式:

  1. 默认情况下,误操作,30分钟自动销毁 对于这个失效时间,可以通过配置进行修改
  • 在项目的web.xml中配置
<session-config>
<!--单位是分钟,这里设置10分钟后session失效-->
<session-timeout>10</session-timeout>
</session-config>
  • 如果没有配置,默认是30分钟,默认值在Tomcat的文本web.xml配置文件中写死的
  1. 调用session对象的invalidate()进行销毁
package 路径......;
import 引入依赖包......;
...
@webServlet("/SessionSetServlet")
public class SessionSetServlet extends HttpServlet{
    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
    //获取session对象

HttpSession session =request.getSession();
System.out.println("Session in SessionGetServlet is "+session);
//销毁session
session.invalidate();
//获取值(测试一下)
String userName(String)session.getAttribute("userName"):
System.out.println("userName is" +userName);
    }
}