什么是会话
用户打开浏览器,访问web服务器的资源,会话建立,直到一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
- 从浏览器发出请求到服务端,服务端再响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了
- 会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着。
- 浏览器和服务器就可以继续使用这个会话进行请求发送和响应,上述的整个过程被称为会话。
会话跟踪
一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
- 服务器会收到多个请求,这多个请求可能来自多个浏览器
- 服务器需要用来识别请求是否来自同一个浏览器。
- 服务器用来识别浏览器的过程,这个过程就是会话跟踪。
- 服务器识别浏览器后,就可以在同一个会话中多次请求之间来共享数据。
一个会话中的多次请求为什么要共享数据呢?有了这个数据共享功能后能实现哪些功能呢?
- 购物车:加入购物车和去购物车结算是两次请求,但是后次请求要想展示前一次请求所添加的商品,就需要用到数据共享。
- 页面展示用户登录信息:很多网站,登陆后访问多个功能发送多次请求后,浏览器上都会有当前登录用户的信息【用户名】
- 网站登录页面的免登录功能:当用户登录成功后,勾选【自动登录】按钮后,下次再登录的时候,网站就会自动填充用户名和密码,简化用户的登录操作,多次登录就会有多次请求,他们之间页涉及到共享数据。
- 登陆页面的验证码功能:获取验证码和输入验证码点击登录也是两次请求,这两次请求的数据之间要进行对比,相同则允许登录,不同则拒绝登录,该功能的实现也需要在同一次会话中共享数据。
为什么现在浏览器和服务器不支持数据共享?
- 浏览器和服务器之间使用的是HTTP请求来进行数据传输
- HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求
- HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响
- 请求与请求之间独立后,就无法实现多次请求之间的数据共享
如何实现会话跟踪?具体方案:
- 客户端会话跟踪技术:Cookie
- 服务端会话跟踪技术: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();
示例
- 在CookieSetServlet中存入cookie信息,然后重定向success.jsp,提示保存cookie成功
- 在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)
参数
- 正数;将Cookie写入浏览器所在的电脑的硬盘,持久化存储,到时间自动删
- 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
- 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中存入的数据
- 创建名为SessionSetServlet的Servlet类,获取Session对象并存储到session中
- 创建名为SessionGetServlet的Servlet类,获取Session对象中存储的数据
- 启动测试
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就会被删除掉
小结
- session数据存储在服务端,服务器重启后,session数据会被保存
- 浏览器被关闭启动后,重新建立的连接就已经是一个全新的会话,获取的session数据也是一个新的对象
- session的数据要想共享,浏览器不能关闭,所以session数据不能长期保存
- cookie是存储在客户端,是可以长期保存的
Session销毁
session的销毁有两种方式:
- 默认情况下,误操作,30分钟自动销毁 对于这个失效时间,可以通过配置进行修改
- 在项目的web.xml中配置
<session-config>
<!--单位是分钟,这里设置10分钟后session失效-->
<session-timeout>10</session-timeout>
</session-config>
- 如果没有配置,默认是30分钟,默认值在Tomcat的文本web.xml配置文件中写死的
- 调用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);
}
}