大白话讲解之Session

本文详细解释了会话(Session)的概念、Session与Request的区别,以及它们与Cookie的关系。强调了Session在维持客户端状态和共享数据中的作用,涉及权限校验和Session的生命周期管理。

很多小白刚接触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);
    }
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值