Session简介
- Session表示会话,不止在javaweb中存在,只要是web开发,都会存在Session会话。
- Cookie将会话状态保存在客户端,Session将会话状态保存在服务器端。
- HttpSession是一个会话级别对象,一次会话对应一个HttpSession对象。
- 在web容器中,web容器维护了大量的HttpSession对象,换句话说,在web容器中有一个“Session”列表。
//获取当前session,获取不到,则新建
HttpSession session = request.getSession();
//获取当前session,获取不到,则新建
HttpSession session = request.getSession(true);
//获取当前session,获取不到,返回null
HttpSession session = request.getSession(false);
Session实现原理
- 打开浏览器,在浏览器上发送首个请求。
- 服务器会创建一个HttpSession对象,该对象表示一个会话。
- 同时生成HttpSession对象对应的Cookie对象,并且该Cookie对象的name是JSessionID,Cookie的value是32位的字符串。
- 服务器将Cookie的value和HttpSession对象绑定到Session列表。
- 服务器将Cookie发送浏览器缓存中,浏览器不关闭,Cookie不会消失。
- 当再次请求时,会自动提交缓存中的Cookie.
- 服务器接收到Cookie,验证Cookie的name是否是JSessionID,获取对应value.
- 通过Cookie的value去Session列表找对应的HttpSession对象。
Cookie禁用Session跟踪
重定向时跟踪
非重定向时跟踪
注意:这样做到导致SessionID暴露到地址栏,更加不安全,一般建议不禁用cookie,若禁用cookie,则无法访问该网址。
浏览器关闭,Session对象被销毁吗?
- 浏览器关闭,不会销毁session对象。
- 因为B/S系统基于HTTP协议,HTTP协议是样子无连接/无状态协议。
- 因为请求瞬间浏览器和服务器通道打开,响应结束后,通道关闭。
- 为了减轻服务器压力。
Session对象什么时候销毁
- web系统引入session超时。
- 当很长时间(一段时间)没有用户访问该session对象,此时session对象超时,web服务器自动回收session对象。
- 可配置:在web.xml默认30分钟
<session-config>
<!--120分钟-->
<session-timeout>120</session-timeout>
</session-config>
- 在代码中设置(优先级高于web.xml)
session.setMaxInactiveInterval(30*60);//以秒为单位
会话定义
- 一般情况下:用户打开浏览器,进行一系列操作,然后将浏览器关闭,表示一次会话结束。
- 本质描述:从session对象创建,到session销毁,才是真正意义一次会话。
HttpSession对象常用接口
- Object getAttribute(String var1);
- void setAttribute(String var1, Object var2);
- void removeAttribute(String var1);
- void invalidate(); ————-session销毁
- session.setMaxInactiveInterval(30*60);//以秒为单位
ServletContext HttpSession HttpServletRequest接口
ServletContext Application:应用范围;完成跨会话共享数据。
HttpSessionHttp session:会话范围;完成跨请求共享数据,请求在同一个会话中。
HttpServletRequest request:请求范围;完成跨Servlet共享数据,这些Servlet在同一个请求(转发)。
模拟拦截登陆(无实际用途,仅仅为了理解session)
功能:登陆后跳到success.jsp页面,点击“是否登陆成功”,若已登陆,显示登陆成功,若没有登陆跳到success.jsp页面,点击“是否登陆成功”,则返回登陆页面index.jsp。
- 登陆页面,index.jsp
<form action="/servlet/a" method="get">
姓名<input type="text" name = "name"> <br>
密码<input type="password" name = "password"><br>
<input type="submit" value="登陆">
</form>
- 验证登陆名,密码,Indexservlet.java
@WebServlet(value ="/a")
public class Indexservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取页面传来的值
String name = request.getParameter("name");
String password = request.getParameter("password");
//验证账号密码
if ("admin".equals(name) && "123456".equals(password)) {
//获取当前session,获取不到,则新建
HttpSession session = request.getSession();
session.setAttribute("name",name);
session.setAttribute("password",password);
//跳转成功页面
response.sendRedirect(request.getContextPath()+"/success.jsp");
} else {
//跳转失败页面
response.sendRedirect(request.getContextPath()+"/error.jsp");
}
}
}
- 成功页面,success.jsp
登陆成功<br>
<a href="/servlet/b">是否登陆</a>
- 验证是否登陆,Welcomeservlet.java
@WebServlet(value ="/b")
public class Welcomeservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//获取当前session,获取不到,返回null
HttpSession session = request.getSession(false);
//验证是否登陆,通过name,password是否有值判断
if (session != null && session.getAttribute("name") !=null && session.getAttribute("password")!=null) {
//已经登陆
out.print("已经登陆了");
out.print(session.getAttribute("name"));
out.print(session.getAttribute("password"));
} else {
//未登陆,跳转到登陆页面
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}
}