Cookie实现免密登录

今天做demo的时候想做个Cookie实现自动登录
即:如果已经勾选自动登录那么在Cookie有限期间下次直接访问受限内容可以自动登录

我们知道设置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实现免密登录_第1张图片

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

Cookie实现免密登录_第2张图片

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

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

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

看个东西:

Cookie实现免密登录_第3张图片

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

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

那是因为Cookie的协大路径访问在创建的时候就已经指定了

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

Cookie实现免密登录_第4张图片

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

我们换个例子

创建Cookie的Servlet:

/*
    将此Servlet的虚拟路径改为/user/add 也就是二级路径
    那么他的上一级是/user
    也就是在此Servlet内创建的Cookie默认携带范围为/Test/user下的所有路径
    (setPath()可以修改cookie的携带范围路径)
 */
@WebServlet("/user/add")			
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实现免密登录_第5张图片

可以看到响应上有携带Cookie信息,(请求cookie信息被我删了,不用疑惑)

Cookie实现免密登录_第6张图片

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

可以调用cookie的setPath("/");代表所有路径下都会携带此cookie信息

Cookie实现免密登录_第7张图片
Cookie实现免密登录_第8张图片

你可能感兴趣的:(IDEA,Java,前端)