Skip to content

6.Cookie

Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。

如果浏览器被配置为存储 Cookie,它将会保留此信息直到到期日期。如果用户的浏览器指向任何匹配该 Cookie 的路径和域的页面,它会重新发送 Cookie 到服务器。

可在servlet中添加、读取、删除cookie。

Servlet Cookie 处理需要对中文进行编码与解码,方法如下:

String str = java.net.URLEncoder.encode("中文""UTF-8");            //编码
String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8");   // 解码
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();

        resp.setContentType("text/html");

        String name = req.getParameter("name");
        String url = req.getParameter("url");

        Cookie nameCookie = new Cookie("name", URLEncoder.encode(name, "UTF-8"));//中文需要转码存储
        Cookie urlCookie = new Cookie("url", url);
        nameCookie.setMaxAge(60);
        nameCookie.setComment("storaged name");
        urlCookie.setMaxAge(60);
        urlCookie.setComment("storaged url");

        resp.addCookie(nameCookie);
        resp.addCookie(urlCookie);

        //重定向
        resp.sendRedirect("/ReadCookie");
//        throw new ServletException();

    }
}
@WebServlet("/ReadCookie")
public class ReadCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        resp.setContentType("text/html");

        Cookie[] cookies = req.getCookies();
        out.write("<ul>\n");
        for (Cookie cookie:cookies){
            //读取编码的cookie需要解码
            out.write( cookie.getName() + ":<li>" + URLDecoder.decode(cookie.getValue(), "UTF-8") + "</li>\n");
        }
        out.write("</ul>\n");
    }
}

如果想删除一个 cookie,那么您只需要按照以下三个步骤进行:

  • 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
  • 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
  • 把这个 cookie 添加到响应头。