什么是session?
session即会话的意思。用户打开一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一次会话。 session是服务器端技术,用来跟踪用户状态。当客户端第一次发起请求后,服务器会生成一个唯一的session id并通过响应发回给客户端,客户端以后的每次请求都要将这个session id发给服务器(用cookie来实现),服务器根据这个session id来匹配会话,如果存在则将对应会话与此请求关联,以获取用户状态。session可以存放在内存,文件,数据库中。 服务器在运行时为每一个用户浏览器创建一个独享的session对象,即一个session对象对应一个用户浏览器
删除session
有两种方式:
- 通过配置web.xml文件,设置session的有效期(超时时间);
<session-config>
<session-timeout>10</session-timeout>
</session-config>
- 删除指定键值的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");
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();
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";
session.removeAttribute(student);
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跟踪的原因。
如果浏览器禁用cookie怎么办?
一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
|