会话技术之session

本文详细解析了Servlet中Session的工作原理。Session存储在服务器端,依赖Cookie中的JSESSIONID来标识用户。当用户首次访问时,服务器创建Session并返回JSESSIONID给浏览器。之后的请求携带此Cookie,服务器据此找到对应的Session。Session用于存储用户关键信息,如购物车数据。需要注意的是,Idea环境下无法实现Session的持久化,需部署到Tomcat。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/sessiondemo")
public class SessionDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        * Session存储在服务器端,一般存储在服务器的内存中(为了高速存取)
        *
        * 虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。
        * 这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,
        * Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,
        * 它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
        * */

        //获取session
        HttpSession session = req.getSession();//session的对象全称叫HttpSession
        /*
        * 存放数据
        * void setAttribute(String name, Object value);
        * 获取数据
        * Object getAttribute(String name);
        * 删除数据
        * void removeAttribute(String name);
        **/

        /*
        * 这不得不引发一个问题的思考
        * cookie的技术是基于请求头和响应头
        * 不同的用户的浏览器中存放的cookie肯定是当时访问服务器时响应体带回来的, 那么不同用户再去访问浏览器时, 服务器接受到的cookie一定是具体用户浏览器发送的req的
        * 请求头中的,以此来实现区分不用用户的cookie
        * 那么session呢
        * 它是在服务器中的
        * 是怎么区分获取到的session是具体哪一个用户的呢
        *
        * 这个问题应该分两种情况
        * 第一种是
        * 该用户第一次获取session
        * 浏览器中并没有可以用来识别这个session是具体哪一个用户的session的cookie信息
        * 那么这个session就不会是服务器中已有的session
        * 并且这个session会生成一个唯一的id
        * 并且在响应时带回给该用户一个cookie对象, 键都是JSESSIONID, 值就是那个唯一的id
        *
        * 第二种就是
        * 该用户的浏览器中已经有session的cookie信息,也就是JSESSIONID
        * 那么获取session时就会根据JSESSIONID的值获取相应的session
        * */

        /*
        * 这样一来
        * session可以说完全依赖于cookie有JSESSIONID信息才能被用户认领
        * 存放JSESSIONID信息的cookie对象能生存多久,就是用户能使用到这个session多久,也就是用户于服务器的这次会话能多久.
        * 也即是说,默认情况下,cookie对象的信息浏览器一关闭就销毁了,重开的浏览器就算是同一个用户,获取的session也将是一个新的session
        * 就算原本的session依然在服务器中存活,用户也用不到了.就相当于和服务器一次新的会话
        *
        *
        * 例如购物车的实现就是使用的session
        * 也就是对于用户来说session放的信息是很重要的
        *
        *
        * 这里要记录一个点, idea不能实现session的锐化
        * 只能实现钝化
        * 也就是说,如果想使用session的锐化,需要学会将项目部署到tomcat
        *
        * */
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值