cookie implements session

cookie实现会话

  服务器调用response.addCookie()设置set-cookie响应头后,浏览器收到这个响应头与数值后,会将它以文件的形式存储于本地PC上。当浏览器再次访问同一Web服务器时,会将之前收到的cookie作为cookie请求头自动发送给服务器。
  Cookie是HTTP header的一部分,其传输由HTTP协议控制。
  浏览器通常支持每个网站写出20个cookies。

API使用

  使用setMaxAge()可以设定Cookie的有效期限,单位是“秒”,这样就会覆盖缺省设置——关闭浏览器后Cookie就失效。
  服务端若要读取浏览器提交的cookie,可以通过HttpServletRequest接口的getCookies方法,该方法返回一个Cookie数组,若没有cookies则返回null。你需要遍历整个数组来查询某个特定名称的cookie。目前,还没有类似于getCookieByName这样的方法来帮助简化工作。
  服务端也没有直接删除cookie的方法,只能创建一个同名的cookie,并将maxAge属性设置为0,并添加到HttpServletResponse接口中。

新特征

  在Servlet 3.0中,Cookie类新增了setHttpOnly()方法,可以将Cookie标示为仅用于HTTP,这会在set-cookie标头上附加HttpOnly属性,在浏览器支持的情况下,这个Cookie将不会被客户端脚本(例如JavaScript)读取,可以使用isHttpOnly()来得知一个Cookie是否被setHttpOnly()标示为仅用于HTTP。

缺点

  Cookies的问题在于用户可以通过改变其浏览器设置来拒绝接受cookies。       

example

package com.test;

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

@WebServlet("/write.do")
public class WriteCookie extends HttpServlet {

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("Hello", "World");
        cookie.setMaxAge(7 * 24 * 60 * 60);
        resp.addCookie(cookie);
        resp.getWriter().write("cookie writed");
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}
package com.test;

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

@WebServlet("/read.do")
public class ReadCookie extends HttpServlet {

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                PrintWriter writer = resp.getWriter();
                writer.println("cookie name:    " + name);
                writer.println("cookie value:   " + value);
            }
        }
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}
原文地址:https://www.cnblogs.com/Mike_Chang/p/10054072.html