Session会话
Session简介
什么是Session?
答:Session就是一个接口HttpSession。在web中Session就一会话,维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的Session会话,用来保存用户登陆之后的信息。
Session和Cookie有什么区别?
答:Cookie是保存在客户端的,Session是保存在服务器端的
Session有关操作
Session的创建与获取
Session的获取和创建的API是一样的
request.getSession()
:第一次调用是创建Session会话,之后调用都是获取创建好的Session会话对象。
isNew()
:判断到底是不是刚穿件出来的(新的)
true
表示刚穿件false
表示获取之前创建
每个会话都有一个身份证号,ID值(唯一),可以通过getId()
获取Session的id值
protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建和获取Session会话对象
HttpSession session = request.getSession();
// 判断 当前Session会话,是否是新创建出来的
boolean isNew = session.isNew();
// 获取Session会话的唯一标识 id
String id = session.getId();
//打印
response.getWriter().write("得到的session 的 id 为: " + id + "<br/>");
response.getWriter().write("得到的session 是否是新的 : " + isNew + "<br/>");
}
Session数据存取
Session数据是是保存在服务器内部的数据,其可以存储对应客户端中的数据,存取方法如下
/**
* 往Session中保存数据
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().setAttribute("key1", "value1");
response.getWriter().write("存数据到 session·····");
}
/**
* 获取Session域中的数据
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object key1 = request.getSession().getAttribute("key1");
response.getWriter().write("从session获取的 key1 的数据是: " + key1);
}
Sessuib生命周期
-
public void setMaxInactiveInterval(int interval)
:**设置 Session 的超时时间(**以秒为单位),超过指定的时长,Session 就会被销毁。- 值为正数的时候,设定 Session 的超时时长。
- 负数表示永不超时(极少使用)
-
public int getMaxInactiveInterval()
:获取Session的超时时常,通常session的默认超时时间是30min。该项数据可以通过在web.xml中配置实现修改<session-config> <session-timeout>30</session-timeout> </session-config>
- 可以根据自己的需求修改所有Session或者修改某个单独的Session
-
public void invalidate()
:让当前Session会话立刻无效
设置当前session超时时间为3s
protected void life3s(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 先获取Session对象
HttpSession session = request.getSession();
// 设置当前Session3秒后超时
session.setMaxInactiveInterval(3);
response.getWriter().write(" 当前Session已经设置为3秒后超时 ");
}
关于Session超时概念的详细介绍
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tcevIxgM-1614148572414)(/Users/gaojunsong/Library/Application Support/typora-user-images/Java学习/JAVAWeb/image-20210219152526877.png)]
Session的超时时常:客户端两次请求的最大间隔时长
让session会话立刻超时
protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 先获取Session对象
HttpSession session = request.getSession();
// 让Session会话马上超时
session.invalidate();
response.getWriter().write("Session已经设置为超时(无效)");
}
浏览器与session的关联
Session技术,底层其实是基于Cookie技术实现的
小结:客户端在没有Cookie的情况下访问服务器,服务器创建session,并将session存储进内存,同时将sessionId信息通过cookie发送给浏览器,浏览器收到cookies后,当携带当前cookie信息再次访问服务器时,服务器就会从内存中取出对应的session数据。