转载

U01_009 Servlet3存值之Cookie

概念:

  • javax.servlet.http.Cookie 用于服务器在客户端保存信息,这些信息就像小甜点一样,数据量并不大,服务器端在需要的时候可以从客户端读取。
  • Cookie常用于保存用户的帐号密码,或者记录用户访问网站的喜好,如有无背景音乐、网页的背景色等。
  • 谷歌浏览器的Cookie一般保存于下面的位置:
    • C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/Default/Cache
  • Cookie和Session存值的对比分析
    • Cookie是保留在客户端,安全性低,Session保留在服务端,安全性高。
    • Cookie生命周期是累积的,Session的生命周期是间隔的,以20分钟为例:Cookie从创建时开始计时,20分钟后失效,Session从创建时开始计时,如果在20分钟内没有任何请求访问过这个Session,则Session失效,但如果20分钟内,比如第19分钟的时候,有一个请求访问了该Session,那么它的生命周期将重新开启一个20分钟。
    • 关机会造成Session生命终结,但是对Cookie没有任何影响。

2. Cookie相关API

代码 描述
new Cookie("K", "V") 通过构造器注入要存储的KV对信息
setMaxAge() 设置cookie存活时间,单位为秒,如果不设置或者设置为0,则cookie不存在
getName() 获取cookie中的key
getValue() 获取cookie中的value
resp.addCookie() 将Cookie回写到客户端
req.getCookies() 从请求中获取所有Cookie,返回一个Cookie数组

3. Cookie存取值案例

需求:在Servlet中利用Cookie存值,然后在页面端使用JS取出。

源码:

/**
 * @author JoeZhou
 */
@WebServlet("/servlet/cookie")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

        // 转码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // 设置cookie,存7天,并回写到客户端
        Cookie usernameCookie = new Cookie("username", "admin");
        usernameCookie.setMaxAge(7 * 24 * 3600);
        resp.addCookie(usernameCookie);

        // 遍历请求中的所有cookie,打印username对应的值
        // 第一次请求时刚完成Cookie的回写,取不到Cookie[],第二次请求可以取到
        Cookie[] cookies = req.getCookies();
        for (int i = 0, j = cookies.length; i < j; i++) {
            if ("username".equals(cookies[i].getName())) {
                System.out.println(cookies[i].getValue());
                break;
            }
        }
        // 转
        req.getRequestDispatcher("/main.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        
        this.doGet(req, resp);
    }
}
复制代码

脚本:页面端可以使用JS取值。

onload = () => {
    let result;
    
    /*按照分号和空格分割的cookies*/
    let cookies = document.cookie.split("; ");
    
    /*循环遍历这个数组*/
    for (let i = 0, j = cookies.length; i < j; i++) {
    
        /*将每一个KV对再按照等号分割*/
        let kvs = cookies[i].split("=");
        
        /*如果"username"对应的值*/
        if (kvs[0] === "username") {
            result = kvs[1];
            break;
        }
    }
    console.log(result);
}
复制代码
原文  https://juejin.im/post/5ea13f6251882573cb723b31
正文到此结束
Loading...