大白话讲解之Session
很多小白刚接触session时都会带着很多疑问,什么是session?session和cookie有什么关系?session和request有什么区别?这里带大家一文详解!!! (1)什么是Sessi...
很多小白刚接触session时都会带着很多疑问,什么是session?session和cookie有什么关系?session和request有什么区别?这里带大家一文详解!!!
(1)什么是Session?
会话是指客户端与服务器之间建立的一种持久性的交互。它通常用于在多个请求之间维护客户端的状态信息。会话通常是通过一种机制来跟踪用户在服务器上的状态信息。最常见的方式是使用会话标识符(Session ID)来唯一标识一个会话。通俗来讲,当客户端和负端建立会话后,session连接不会立即关闭而是持续存在的。
(2)Session和Request的区别?
Session:session前面我们说了客户端与服务器之间建立的一种持久性的交互,用于在多个请求之间维护客户端的状态信息。
Request:request是基于Http协议的这个过程是无状态的即当一个request结束后不会对其他请求产生影响。通俗来讲,请求的完成过程是客户端发起请求到服务端,服务端处理请求并返回响应。这个过程是短暂的且独立的。
以上是它们的区别,而另一个重点是session域的概念。在一个会话session中,如果在一个请求(比如请求 A)中存储了数据到会话的域中,那么在后续的请求(比如请求 B)中,可以从同一个会话的域中读取这些数据,实现了在多个请求之间共享信息的目的。为什么session域的数据在两次请求到来都一直在呢?因为我们说了sesssion会话是持久性的!!!
所以综上来看,session会话可以维持多个请求的共享数据,得益于它的持久性这种机制使得在用户的整个会话期间,可以在不同的请求之间共享状态信息。这对于需要在用户会话期间保持持久性状态的应用场景非常有用,比如用户登录状态、购物车内容、用户偏好设置等。
(3)Session和Cookie的关系?
Session和Cookie更像是一对兄弟!
下面我将用实际案例来证明session和cookie的关系。
第一句话:每当一次请求到达服务器,如果开启了会话(访问了session),服务器第一步会查看是否从客户端回传一个名为JSESSIONID的cookie,如果没有则认为这是一次新的会话,会创建一个新的session对象,并用唯一的sessionld为此次会话做一个标志,这个sessionid是JSESSIONID的cookie的值即创建后会将这个cookie给返回客户端。
用流程图可能更清晰!上述的过程就是下述的黄色流程。
下面给大家具体的案例!
当客户端的cookie不存在名为JSESSIONID的cookie时,如下:
服务端会生成一个session,我们打印出sessionid。
@WebServlet("/server01")
public class servelt extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//获取session的id
String id = session.getId();
System.out.println(id);
}
}
此时我们再回看客户端时,这是客户端就存在了一个名为JSESSIONID的cookie,且值就是后端生成的session的id。
第二句话:如果有JSESSIONID这个cookie回传,服务器则会根据]JSESSIONID这个值去查看是否含有id为JSESSION值的session对象,如果没有则认为是一个新的会话,重新创建一个新的session对象,并标志此次会话。对应到流程图是:
第三句话:如果有]BSIONID这个cookie回传,服务器则会根据JSESSIONID这个值去查看是否含有id为JSESSION值的session对象,如果找到了相应的session对象,则认为是之前标志过的一次会话,返回该session对象,数据达到共享。
(4)Session域对象
Session 用来表示一次会话,在一次会话中数据是可以共享的,这时session作为域对象存在,可以通过setAttribute(name,value)方法向域对象中添加数据,通过getAttribute(name)从域对象中获取数据,通过removeAttribute(name)从域对象中移除数据。
public class servelt extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//获取session域对象
session.setAttribute("name","zhangsan");
//获取指定名称的session域对象
String name = (String)req.getAttribute("name");
}
}
上述是一个简单的案例,那么如果实际应用我们该怎么使用域对象?
实际情况下我们常常将session域用于权限校验,下面给出具体步骤。
(1)用户登录密码和账号后,客户端的请求会携带密码和账号到服务端。
(2)服务端判断当前用户的账号和密码是否正确,如果正确则生成一个sessionid,将该session存储在session域中,并返回客户端成功的消息同时也携带一个cookie这个cookie存储了sessionid。
(3)用户登录成功后,假设点击下单衣服,则这个请求会携带之前存储sessionid的cookie,此时服务端根据sessionid判断自己是否存在这个session,如果存在则之间进行下单业务处理,如果不存在则跳转登录界面。
(5)Session的销毁
在tomcat中配置session时间
当客户端第一次请求servlet并且操作session时,session对象生成,Tomcat中session默认的存活时间为30min,即你不操作界面的时间,一旦有操作,session 会重新计时。
那么session的默认时间可以改么?答案是肯定的。
可以在Tomcat中的conf目录下的web.xml文件中进行修改。
自己设定到期时间
当然除了以上的修改方式外,我们也可以在程序中自己设定session的生命周期,通过session.setMaxInactivelnterval(int)来设定session的最大不活动时间,单位为秒。
@WebServlet("/server01")
public class servelt extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//获取session的过期时间
int maxInactiveInterval = session.getMaxInactiveInterval(10);
}
}