网站首页 波兰世界杯 世界杯球星排名 直播吧世界杯
首页 >> 波兰世界杯
大白话讲解之Session

大白话讲解之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);

}

}