客户端会话技术cookie是保存在客户端浏览器的,那么与之相对的服务器端会话技术session是保存在服务器端的。
会话技术旨在数据的共享,下面一段session的代码演示:
@WebServlet("/servletSession01") public class ServletSession01 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取session对象 HttpSession session = request.getSession(); session.setAttribute("name","zhangsan"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
资源类2:
@WebServlet("/servletSession02") public class ServletSession02 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession();//获取session String name = (String) session.getAttribute("name"); System.out.println(name); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
服务器如何确保在一次会话范围内多次获取的session对象是同一个?
第一次请求资源类1的响应头:
第一次请求资源类2请求头:
可以看出两幅图的JSESSIONID是相同的
代码如下:
@WebServlet("/servletSession02") public class ServletSession02 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession();//获取session String name = (String) session.getAttribute("name"); Cookie cookie=new Cookie("JSESSIONID",session.getId());//手动设置依赖cookie cookie.setMaxAge(60*5);//设置依赖cookie的存活时间为5分钟 response.addCookie(cookie); System.out.println(name); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
2.客户端不关闭服务器关闭:
在idea中访问的并不是同一个,但是在实际开发中这样访问的其实会是同一个session对象,原因是:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
原文:https://www.cnblogs.com/ZYH-coder0927/p/13700729.html