首页 > 其他分享 >Cookie + session 理解

Cookie + session 理解

时间:2023-08-02 17:57:46浏览次数:35  
标签:Session 理解 request session Cookie cookie 客户端

Http是一种无状态的应用层传输协议。可以理解成请求之间没有联系。但是很多场景,比如需要知道上次是哪个用户登录了。这时就要用到cookie和session了。 一. Cookie Cookie是一种客户端技术,可以理解成用户信息存储在客户端。客户端第一次请求服务器时,如果需要记录用户状态,就用response特意给客户端生成一个Cookie,客户端会自动保存起来。当再次请求时,客户端把Cookie也提交给服务器。服务器通过request拿到cookie,就可以判断用户状态。下面举个简单的代码应用。    

//自定义拦截器,要结合MyWebConfig使用
@Component
public class CookieInterceptor implements HandlerInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(CookieInterceptor.class);

    /**
     * 在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("CookieInterceptor preHandle");
        String requestURI = request.getRequestURI();
        Cookie[] cookies = request.getCookies();
        //1.如果是登录接口,则设置cookie
        if (requestURI.contains("/loginInfo/login")) {
            response.addCookie(new Cookie("hasLogined", "true"));
            //2.如果不是登录接口,则校验有无cookie
        } else {
            boolean flag = false;
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if (cookie.getName().equals("hasLogined")) {
                        flag = true;
                        break;
                    }
                }
            }
            if (!flag) {
                LOGGER.error("please login first");
                return false;
            }
        }
        return true;
    }
  举例代码里,我们把Cookie处理放在拦截器里,一般项目里也都可以这样处理,拦截器可以用请求做一些预处理,比如这里用Cookie校验用户的登录状态。如果请求是登录接口,那么生成一个Cookie(客户端可以存储多个cookie),用response.addCookie方法即可传给客户端。当不是登录的请求过来时,就先从request里拿到所有Cookie,看看是否有用户登录状态,如果没有直接被拦截。这里只是个简单的应用,实际场景会相对复杂,也可以给cookie设置域,存活时间等。   二. Session Session是一种服务器端技术,可以理解成把用户登录状态存在服务器端。登录接口里,服务器生成一个Session,里面可以保存用户信息。当请求业务接口时,先获取Session,再进一步核对用户信息。那么客户端是怎么获取到Session的呢,实际上Session还是要配合Cookie使用,在生成Session时候,底层会把这个Session对应的SessionId存到Cookie中传给客户端,再次请求时就可以拿到SessionId去服务器里找对应的Session。下面举个简单的代码应用。  
private Set<String> sessionIds = Sets.newHashSet();
/**
 * 在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
 */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("SessionInterceptor preHandle");
    String requestURI = request.getRequestURI();
    //1.如果是登录接口,则设置session
    if (requestURI.contains("/loginInfo/login")) {
        // 用户登陆时如果携带了sessionid,则先将session做invalid处理
        HttpSession session = request.getSession(false);
        if (null != session) {
            session.invalidate();
        }
        // ture,则如果获取不到session,会生成一个;因为上面已失效,所以这里会新生成一个
        session = request.getSession(true);
        String sessionId = session.getId();
        System.out.println("preHandle sessionId=" + sessionId);
        //可以将sessionID存到数据库,redis,内存中;分布式场景中一般会存到redis;此处存在内存中
        sessionIds.add(sessionId);

        //额外业务
        InfoVO infoVO = new InfoVO();
        infoVO.setName("libai");
        session.setAttribute("myKey",infoVO);
    } else {
        String sessionId = request.getSession().getId();
        System.out.println("request sessionId = " + sessionId);

        if (!sessionIds.contains(sessionId)) {
            LOGGER.error("please login first");
            return false;
        }

        //额外业务
        HttpSession session = request.getSession();
        InfoVO myKey =(InfoVO) session.getAttribute("myKey");
        System.out.println(myKey);
    }
    return true;
}
  同样把Session处理放到拦截器里。可以看到生成Session很简单,就是request.getSession(boolean flag)。flag为false表示获取Session,如果获取不到为null。如果flag为true,如果获取不到,则新生成一个Session。上面的业务场景每次登陆都把原来的Session失效,新生成一个Session。然后把Session对应的SessionId(随机生成的字符串,大概长这样:D8F5058D22978D71D14644777571AD18)存到内存里。再次请求时,Cookie就会附带SessionId(叫JSESSIONID),简单的场景用SessionId就可以判断登陆状态了。复杂场景里,也可以把真个用户信息放到Session里,如上面代码里注释的额外业务里。   三. 总结 Cookie有安全问题,因为用户信息直接放到客户端,可以被别人看到。另外Cookie存的信息也有限。 Session有性能问题,因为Session一般也会存额外一些信息,比如可以存购物车信息,存在服务器端,用占用服务器的性能。

标签:Session,理解,request,session,Cookie,cookie,客户端
From: https://www.cnblogs.com/zeenzhou/p/17601368.html

相关文章

  • 过滤器拦截器,Interceptor+Filter 理解
    在我们springMVC项目中,一个客户端请求到达DispatcherServlet前会依次经过过滤器(Filter)和拦截器(Interceptor),所以有必要了解下过滤器和拦截器分别做了啥以及项目中该如何配置。 一.Filterpackagejavax.servlet 1.三个方法1.1init():初始化参数,在创建Filter调用,当我......
  • Linux su命令:su命令语法、su root与su - root区别、su与sudo区别、su -c 参数的使用理
    https://www.cnblogs.com/goloving/p/15150206.html Linuxsu(英文全拼:switchuser)命令用于变更为其他使用者的身份,除root外,需要键入该使用者的密码。使用权限:所有使用者。一、语法su[-fmp][-ccommand][-sshell][--help][--version][-][USER[ARG]]1、参数说......
  • flask as_view源码,请求响应,cookie,session
    1CBV1cbv写法 -1写个类,继承MethodView-2在类中写跟请求方式同名的方法-3注册路由:app.add_url_rule('/home',view_func=Home.as_view('home'))#home是endpoint,就是路由别名2cbv加装饰器 -方式一: classHome(MethodView): decorators=[auth]#......
  • 理解面向对象 谁调用基类 谁self.data里就被yaml中类 赋值
    classBaseAPI:#基类相当于动物类;登录属于继承类,相当于老虎类#属性def__init__(self,token=None):#店铺类,订单类,支付模块等都需要使用token所以过滤一下iftoken:#如果接口需要token店铺类,订单类,支付模块等都需要使用token......
  • 谈谈对Object.defineProperty的理解
    在Vue2实现数据和页面的绑定和双向绑定使用的就是Object.defineProperty方法,然后看到Vue-Router源码的时候发现了一个有趣的事情.就是:通过代理B得到了A对象,其实是相当于B和A其实都指向了同一个地址值,我们在使用Vue的时候去改变或者拿取值一直都是通过A去拿的,在Vue里面他代理......
  • Docker使用理解
    1.轻量级的虚拟机,可以像房间一样隔离每个应用,安装依赖一条命令。  保证同样的运行环境,解决每个计算机运行情况不同的问题。2.镜像是一个发布包,可以发布多个运行实例供用户访问。3.可以将镜像 dockersave 为压缩包给其他人用  命令:dockersave-o./ywtest.tarywtes......
  • 你是否理解空间换时间的思想?
    "空间换时间"是计算机科学和算法设计中的一个基本原则。它指的是在某些算法中,你可以通过使用更多的内存空间来减少执行算法所需的时间,或者反过来,通过减少内存空间的使用来增加执行时间。换句话说,你可以在时间效率和空间效率之间进行权衡。通过增加内存空间,你可以存储预先计算的结......
  • synchronized的理解及使用
    synchronized是Java中用于实现线程同步的关键字,它可以应用于方法或代码块上。它的作用是确保在同一时间只有一个线程可以执行被synchronized修饰的代码,从而避免多线程并发访问共享资源导致的数据不一致或冲突问题。理解synchronized的关键概念是"互斥访问"和"可见性":1.互......
  • 数字逻辑综合 DC 相关理解(四)
    参考《专用集成电路设计实用教程》1.多时钟同步设计时序约束以下图为例,所有的时钟都来自同一个时钟源,所以是它们是同步设计。可以看到要综合的模块输入只有CLKC,其他的时钟只作用于综合模块端口,我们需要对端口加以约束。首先约束作为综合模块的主时钟CLKC,约束语句......
  • javascript按钮通过cookie限制60s后才可以点击
    javascript按钮通过cookie限制60s后才可以点击1️⃣首先创建一个html页面,放入一个按钮 2️⃣设置点击按钮的触发函数一般当点击按钮都会有一些业务需要,在需求结束后,触发saveCookie的方法 3️⃣saveCookie方法当点击查询按钮之后,触发saveCooike方法,按钮倒计时需要一个结束......