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

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » U01_009 Servlet3存值之Cookie

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址