session即会话的意思。用户打开一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一次会话。
session是服务器端技术,用来跟踪用户状态。当客户端第一次发起请求后,服务器会生成一个唯一的session id并通过响应发回给客户端,客户端以后的每次请求都要将这个session id发给服务器(用cookie来实现),服务器根据这个session id来匹配会话,如果存在则将对应会话与此请求关联,以获取用户状态。session可以存放在内存,文件,数据库中。
服务器在运行时为每一个用户浏览器创建一个独享的session对象,即一个session对象对应一个用户浏览器
有两种方式:
- 通过配置web.xml文件,设置session的有效期(超时时间);
10
- 删除指定键值的session,
HttpSession session = req.getSession(); session.removeAttribute(“username”);
直接注销session对象(只会注销当前用户对应的session对象),
session.invalidate();session的使用场景
- 保存一个用户的登录信息
- 保存购物车
- 对于网站经常使用的信息,可以保存在session中
该类主要是设置session信息,对应/s1请求
package com.zhmsky.servlet; import pojo.Student; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //获取session对象 HttpSession session = req.getSession(); session.setAttribute("student", new Student("张依依", 21, "202198873")); if (session.isNew()) { PrintWriter out = resp.getWriter(); out.write("session新创建成功!" + " id是:" + session.getId()); } else { PrintWriter out = resp.getWriter(); out.write("session已存在!" + " id是:" + session.getId()); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
该类主要从session中取出对应信息,对应s2请求
package com.zhmsky.servlet; import pojo.Student; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; public class SessionDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); HttpSession session = req.getSession(); //session可以存放对象 Student student = (Student) session.getAttribute("student"); PrintWriter out = resp.getWriter(); out.write(student.toString()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
该类主要实现手动删除cookie,对应s3请求
package com.zhmsky.servlet; import pojo.Student; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; public class SessionDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); String student = "student"; //删除字段为username的session session.removeAttribute(student); //手动清除session session.invalidate(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
打开浏览器请求/s1地址,通过浏览器控制台可以看到,session id是存放在cookies中的,
通过抓包可以看到,请求头携带的cookie中包含有session id
再请求/s2地址,可以拿到session的对应信息,
之后,再请求/s3地址,执行了invalidate()方法,会清除该session对象的所有信息,注意这里!! session确实是被注销了,但是注销的是上一个session对象,只要浏览器没有关闭,会话保持,服务器会立马再设置一个新的session对象,可以看到此时的请求头的cookie的确还包含了session id,
此时的session id为65AAB60B78F6A7EFAC05EDAFFBA1B999(记住它!)
然后再次请求/s1地址,通过抓包可以看到,
此时响应头里多了set cookie字段,并且包含session id为B062664F4D194C82DEC5AAC7B32D9067,而请求头的cookie字段包含的session id为65AAB60B78F6A7EFAC05EDAFFBA1B999(这就是刚才注销session后产生的session id,也就是标识上一个session对象的session id),而这个响应头的session id为现在这个会话的新session id
通过这个过程,我们可以知道整个session的工作流程:
客户端第一次发送请求给服务器,服务器会返回一个session id,并通过http协议告知客户端需要在cookie中保存这个session id,以后客户端每次再请求服务器时,会把这个session id夹在cookie中一并发送给服务器,服务器根据这个session id来匹配当前会话,从而达到跟踪用户状态的目的。这也是为什么说大多数的应用都是用 cookie 来实现Session跟踪的原因。
一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)