首页 > 其他分享 >Cookie 携带路径详解

Cookie 携带路径详解

时间:2022-12-21 11:35:37浏览次数:46  
标签:携带 路径 request 详解 cookie user Cookie


Cookie携带路径详解

使用​​cookie.setPath()​​可以设置cookie的携带路径,如果不设置默认也会有一个携带路径,默认为当前路径的上一级路径
啥意思?咱们来探究一下吧!

先上个Demo

创建Cookie的Servlet:

@WebServlet("/demo1")
public class Demo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Cookie cookie=new Cookie("username","zhangsan");
response.addCookie(cookie);
}
}

获取Cookie的Servlet:

@WebServlet("/demo2")
public class Demo2 extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();

if(cookies!=null){
for(Cookie c:cookies){

System.out.println(c.getName());
System.out.println(c.getValue());
}
}

}
}

访问demo1,会发现响应头会携带一个刚刚设置的cookie信息写回到客户端

Cookie 携带路径详解_Test

再次访问demo2会发现请求头上会携带​​username=zhangsan​​的cookie信息

Cookie 携带路径详解_Test_02

利用这个我们可以很好的解决Cookie实现自动登录问题

思路:当用户登录一次时把用户数据存储到Cookie写回到客户端,下一次客户再来登录的时候会携带用户的Cookie信息,再把Cookie信息转为user,存入session就实现了自动登录

但是要注意一个点:并不是所有请求都会携带存储到客户端的Cookie信息

看个东西:

Cookie 携带路径详解_cookie_03

​/Test​​是我整个项目的访问路径,那么我整个项目下的所有访问路径都会携带此Cookie,没什么太大问题

为什么此Cookie的携带路径为​​/Test​​呢?

那是因为Cookie的携带路径在创建的时候就已经指定了,默认为当前路径的上一级

即:当前Servlet的虚拟路径的上一级

Cookie 携带路径详解_ide_04

​/demo1​​​已经是根目录了,上一级就是整个项目的访问路径,也就是​​/Test​

我们换个例子

创建Cookie的Servlet:

/*
将此Servlet的虚拟路径改为/user/login也就是二级路径
那么他的上一级是/user
也就是在此Servlet内创建的Cookie默认携带范围为/Test/user下的所有路径
(setPath()可以修改cookie的携带范围路径)
*/
@WebServlet("/user/login")
public class Demo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Cookie cookie=new Cookie("username","zhangsan");
response.addCookie(cookie);
}
}

获取Cookie的Servlet (此时就获取不了Cookie了)

@WebServlet("/demo2")
public class Demo2 extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();

if(cookies!=null){
for(Cookie c:cookies){

System.out.println(c.getName());
System.out.println(c.getValue());
}
}

}
}

首先访问/user/add

Cookie 携带路径详解_ide_05

可以看到响应上有携带Cookie信息

Cookie 携带路径详解_System_06

再次访问demo2,发现已经不再携带Cookie信息了

可以调用在响应cookie之前设置cookie的携带路径setPath("/");代表所有路径下都会携带此cookie信息,或者设置为​setPath(request.getContextPath())​

重新响应Cookie,并把Cookie的携带路径设置为​​/​

@WebServlet("/user/add")
public class Demo01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Cookie cookie=new Cookie("username","zhangsan");
cookie.setPath("/");
response.addCookie(cookie);
}
}

Cookie 携带路径详解_cookie_07


重新测试

Cookie 携带路径详解_System_08

总结

咱们在做项目的时候没有设置Cookie的携带路径好像也没有问题,那是因为咱们一般登录请求为就为​​/login​​​,上一级路径就是当前项目了,因此cookie的携带路径要不为​​/​​​(没有设置项目访问路径),要么就为​​request.getContentPath()​​​(因为​​/login​​的上一级路径就是当前项目),因此很少人注意这个问题

来个表格总结一下:

签发cookie时的路径

cookie默认的携带路径

哪些请求携带此cookie

​/login​

如果有设置项目名:​​/项目名/​​​,如果没有设置项目名:​​/​

整个项目都携带

​/user/login​

​/user​

​/user​​下的所有请求携带

​/user/admin/login​

​/user/admin​

​/user/admin​​下的所有请求携带


标签:携带,路径,request,详解,cookie,user,Cookie
From: https://blog.51cto.com/u_15919174/5959179

相关文章

  • 数据存储全方案,详解持久化技术
    Android系统主要提供了三种方式用于简单的实现数据持久化功能,即文件存储,ShareedPreference存储以及数据库存储.当然,除了这三种方式之外,你还可以将数据保存在手机的SD卡......
  • 安卓文件路径
    安卓文件路径默认的权限只能存取自己应用的文档目录,不能存取外部的存储空间的。Delphi有一个System.IOUtils单元,里面有一个TPath,是一个跨平台的路径操作结构体,里面有获......
  • RecyclerView详解
    1:和Listview的不同:1)Listview只支持纵向列表,RecyclerVeiw支持纵向、横向、网格以及瀑布流;2)ListView是2级缓存机制,RecyclerView是4级缓存机制3)ListView没有强制实现ViewHo......
  • 大端和小端模式详解
    前言对于不了解的看到或者听到“大端”、“小端”就如我一样可能就会很懵,不知道是啥?网上很多文章看的是眼花缭乱,云里雾里,所以本人决定自己写一篇让和我一样经历困惑的人,能......
  • 高性能Mysql主从架构的复制原理及配置详解(转)
    温习《高性能​​MySQL​​》的复制篇.1复制概述     Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过......
  • Spring MVC 拦截器实现登录拦截以及多拦截器的配置执行详解
    持续创作,加速成长!这是我参与「掘金日新计划·10月更文挑战」的第25天,点击查看活动详情前言上一篇文章我们简单了解并完成了SpringMVC拦截器的入门案例,这一篇文章,我们......
  • linux动态库(.so)搜索路径(目录)设置方法
     https://blog.csdn.net/my_angle2016/article/details/121770237 { 在Linux中,动态库的搜索路径除了默认的搜索路径外,还可通过三种方法来指定:方法一:在配置文件/et......
  • const成员,流插入,流提取重载,初始化列表! 流插入,流提取的重载(6千字长文详解!)
    c++详解之const成员,流插入,流提取重载,初始化列表!<<流插入和>>流提取的重载#include<iostream>usingnamespacestd;intmain(){inta=0;doubleb=1.......
  • 深入原型链与继承(详解JS继承原理)
    目录原型链与继承new关键字的执行过程构造函数、实例对象和原型对象原型链的概念及图解第一层__proto__指向:实例对象第二层__proto__指向:Function.prototype和Foo.prototy......
  • vue.nextTick()方法的使用详解
    1,什么是Vue.nextTick()理解:nextTick(),是将回调函数延迟在下一次dom更新数据后调用,简单的理解是:当数据更新了,在dom中渲染后,自动执行该函数,1<template>2<divclass......