cookie概述及cookie实现10天内免登陆功能

cookie的作用:

cookie用于保存会话状态到客户端。保留在以下两个地方:

  • 浏览器的缓存中;
  • 客户端硬盘文件中。

cookie在java中被当作一个类来处理:javax.servlet.http.Cookie;

cookie不仅仅存在于Java中,只要是web开发,B/S架构,只要是基于http协议,就有cookie。

常见的功能:保留购物车上的商品,多天免登陆.......

1.将cookie存放在浏览器缓存中

cookie对象可以通过构造方法直接创建,由两部分组成,name和value;

//第一个参数为cookie名字,第二个参数为cookie的值
new Cookie(String,String);

这种方式创建的cookie会保存在浏览器缓存中,浏览器关闭,则cookie消失。

当浏览器发起请求时,服务器就会给浏览器发送一个cookie,可以发送多个,客户端也可以获取到服务器端发送的cookie:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>cookie</title>
</head>
<body>
    <a href="/servlet_01_javaweb/cookie01">服务器发送cookie给客户端浏览器</a>
</body>
</html>
package com.dh.cookie;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Cookie01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie1 = new Cookie("cookie1", "value1");
        //服务器发送cookie
        response.addCookie(cookie1);
        //客户端可以获取cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            //获取cookie的名字
            String cookieName = cookie.getName();
            //获取cookie的值
            String cookieValue = cookie.getValue();
            System.out.println(cookieName + "=" + cookieValue);
        }
    }
}

cookie和访问的路径有关系。

cookie会和特定的路径绑定在一起,第一次请求,服务器会给客户端浏览器发送cookie,只要没有结束这次会话,再次请求了特定路径,客户端浏览器就会携带绑定的cookie一起发送给服务器。

如:

上述第一次访问:http://localhost:8080/servlet_01_javaweb/cookie01时,服务器会向客户端发送cookie,再次输入http://localhost:8080/servlet_01_javaweb/+任意都会再一次的发送该cookie

设置cookie关联的路径

Cookie cookie1 = new Cookie("cookie1", "value1");
//在发送cookie之前可以指定cookie关联路径
cookie1.setPath(request.getContextPath()+"/a");
//服务器发送cookie
response.addCookie(cookie1);

此时,只有访问与http://localhost:8080/servlet_01_javaweb/a有关的路径,客户端才能发送特定的cookie给服务器。

2.将cookie保存在浏览器硬盘文件中

只要设置cookie的有效时长,并且有效时长>0时,cookie被保存到客户端的硬盘文件中。

Cookie cookie1 = new Cookie("cookie1", "value1");
cookie1.setMaxAge(60 * 60);//单位为秒,即将cookie的有效时长设置为1小时
response.addCookie(cookie1);

当cookie保存到了客户端的硬盘文件中,关闭浏览器也不会清除cookie,只有到了有效时间cookie才会被清除。

但是可以自己删除cookie:

将cookie的有效时间设置为0,即为删除cookie。

//删除cookie
cookie1.setMaxAge(0);

3.cookie实现10天免登陆

先捋一下逻辑:

当用户输入一个地址的时候,先判断是否携带cookie,如果携带了cookie再判断cookie的值,再判断用户名和密码是否正确,如果都正确的话就直接跳转到主页,不需要登陆;

如果没有携带cookie信息的话,就直接跳转到登陆页面,第一次登陆成功,如果勾选了十天免登录,服务器就发送cookie,设置有效时间,保存到客户端硬盘文件中。

web.xml:

<!--    设置欢迎页面-->
<welcome-file-list>
    <welcome-file>checkLogin</welcome-file>
</welcome-file-list>
<!--    登陆-->
<servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>com.dh.cookie.Login</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>
<!--    检查是否携带cookie-->
<servlet>
    <servlet-name>checkLogin</servlet-name>
    <servlet-class>com.dh.cookie.CheckLogin</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>checkLogin</servlet-name>
    <url-pattern>/checkLogin</url-pattern>
</servlet-mapping>

登陆页面:lg.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆页面</title>
</head>
<body>
    <form action="/servlet_01_javaweb/login" method="post">
        用户名:<input name="username" type="text"><br>
        密码:<input name="password" type="password"><br>
        <input name="tenDays" type="checkbox" value="ok">十天内免登陆<br>
        <input type="submit" value="登陆">
    </form>
</body>
</html>

登陆成功页面:success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>success</title>
</head>
<body>
    登陆成功!
</body>
</html>

登陆失败页面:fail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>fail</title>
</head>
<body>
    用户名或密码错误,请
    <a href="/servlet_01_javaweb/lg.html">重新登陆</a>
</body>
</html>

CheckLogin

package com.dh.cookie;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CheckLogin extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取cookie
        Cookie[] cookies = request.getCookies();
        //取出cookie中的值
        String username = null;
        String password = null;
        for (Cookie cookie : cookies) {
            String cookieName = cookie.getName();
            if("username".equals(cookieName)){
                username = cookie.getValue();
            }
            if("password".equals(cookieName)){
                password = cookie.getValue();
            }
        }
        if("zhangsan".equals(username) && "123".equals(password)){
            response.sendRedirect("/servlet_01_javaweb/success.html");
        }else {
            response.sendRedirect("/servlet_01_javaweb/lg.html");
        }
    }
}

Login:

package com.dh.cookie;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Login extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String tenDays = request.getParameter("tenDays");
        //此处不连接数据库
        //用户名和密码正确
        if ("zhangsan".equals(username) && "123".equals(password)) {
            if ("ok".equals(tenDays)) {
                //将用户信息存储到cookie中,并且关联路径和设置有效时间
                Cookie cookie1 = new Cookie("username", username);
                Cookie cookie2 = new Cookie("password", password);
                cookie1.setPath(request.getContextPath());
                cookie2.setPath(request.getContextPath());
                cookie1.setMaxAge(60 * 60 * 24 * 10);
                cookie2.setMaxAge(60 * 60 * 24 * 10);
                //服务器发送cookie给客户端浏览器
                response.addCookie(cookie1);
                response.addCookie(cookie2);
            }
            //跳转到主页
            response.sendRedirect("/servlet_01_javaweb/success.html");
        } else {
            //跳转到登陆失败页面
            response.sendRedirect("/servlet_01_javaweb/fail.html");
        }
    }
}

以上就能实现10天内免登录了。登陆成功后,关闭浏览器,输入http://localhost:8080/servlet_01_javaweb/就能直接跳转到success.html了。

posted @ 2021-03-12 09:13  deng-hui  阅读(1996)  评论(0编辑  收藏  举报