JiangYongKang
9/20/2018 - 11:18 AM

session and cookies

/**
 * Author: vincent
 * Date: 2018-09-20 17:42:00
 * Comment:
 */
 
@WebServlet("/sessions")
public class SessionsController extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        
        // 添加用户相关数据
        session.setAttribute("USERID", UUID.randomUUID().toString().replace("-", ""));

        // 设置 Session 超时时间,单位是秒
        session.setMaxInactiveInterval(3 * 60 * 60);
    }
}
/**
 * Author: vincent
 * Date: 2018-09-20 17:42:00
 * Comment:
 * Cookie 具有不可跨域名性。
 * 根据 Cookie 规范,浏览器访问 Google 只会携带 Google 的 Cookie,而不会携带 Baidu 的 Cookie。
 * Google 也只能操作 Google 的 Cookie,而不能操作 Baidu 的 Cookie。
 * 包括同一域名下面的不同的二级域名也不可以互相操作。
 *
 * 浏览器第一次访问 Tomcat 时,Tomcat 会创建一个 HttpServletSession 会话对象,同时创建一个名为 JSESSIONID 的 Cookie 对象,
 * 该 cookie 存储着当前 HttpServletSession 会话对象的 id,可以通过这个 id 找到当前会话,从而实现了用户状态的保持。
 * 而 Session 对象存活时间默认等于 30 分钟或者浏览器的打开时间,在这段时间内,我们可以获取 Session 对象中存储的任何信息。
 * 这就是 Tomcat 下 Cookie 和 Session 机制
 */

@WebServlet("/cookies")
public class CookiesController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        Cookie cookieExample = new Cookie("USERID", UUID.randomUUID().toString().replace("-", ""));

        // 该 cookie 的注释
        cookieExample.setComment("cookie example");

        // 设置 cookie 适用的域名
        cookieExample.setDomain("https://example.com");

        // 设置是否支持 HttpOnly,当 HttpOnly 设置为 true 的时候,前端 JS 无法通过 document.cookies 获取。
        // 然后就更谈不上操作 cookie 了。总之,设置 HttpOnly 为 true,保证了 cookie 只能通过服务端操作。
        cookieExample.setHttpOnly(true);

        // 如果 MaxAge 属性为正数,则表示该 cookie 会在 MaxAge 秒之后自动失效。
        // 浏览器会将 MaxAge 为正数的 cookie 持久化,即写到对应的 cookie 文件中。
        // 无论客户关闭了浏览器还是电脑,只要还在 MaxAge 秒之前,登录网站时该 cookie 仍然有效。
        // 如果 MaxAge 为负数,则表示该 cookie 仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该 cookie 即失效。
        // MaxAge 为负数的 Cookie,为临时性 cookie,不会被持久化,不会被写到 cookie 文件中。
        // cookie 信息保存在浏览器内存中,因此关闭浏览器该 cookie 就消失了。cookie 默认的 MaxAge 值为-1。
        cookieExample.setMaxAge(-1);

        // 它指定与 cookie 关联在一起的网页。
        // 在默认的情况下 cookie 会与创建它的网页,该网页处于同一目录下的网页以及与这个网页所在目录下的子目录下的网页关联
        cookieExample.setPath("/bar");

        // 它是一个布尔值,指定在网络上如何传输 cookie,默认是不安全的,通过一个普通的 http 连接传输
        cookieExample.setSecure(false);

        // 当前可使用的 Cookie 规范有两个版本:Cookie 版本 0 和 Cookie 版本 1。
        // Cookie 版本 1 是对 Cookie 版本 0 的扩展,版本 1 可以和版本 0 互操作,但是 Cookie 版本 1 没有 Cookie 版本 0 使用的广泛。
        cookieExample.setVersion(0);

        // 重新设定 cookie 的值
        cookieExample.setValue(UUID.randomUUID().toString().replace("-", ""));

        // 将 cookie 添加到响应中
        response.addCookie(cookieExample);
    }
}