Servlet第五篇【Cookie】

会话技术

什么是会话?
答:从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。(浏览器没关,只关闭一个页面会话不算结束)

Cookie的属性

属性名 描述
name Cookie的名称,Cookie一旦创建,名称便不可更改
value Cookie的值,如果值为Unicode字符,需要为字符编码。如果为二进制数据,则需要使用BASE64编码
maxAge Cookie失效的时间,单位秒。如果为正整数,则该Cookie在maxAge秒后失效。如果为负整数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为-1。
secure 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。
path Cookie的使用路径。如果设置为“/sessionWeb/”,则只有该路径为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下的路径都可以访问该Cookie。
domain 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
comment 该Cookie的用处说明,浏览器显示Cookie信息的时候显示该说明。
version Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范。

Cookie的基本使用

public class MyServletA extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        Cookie cookie = new Cookie("name", URLEncoder.encode("张三", "utf-8"));
        cookie.setMaxAge(1000);
        resp.getWriter().write("服务器返回了Cookie!");
        resp.addCookie(cookie);
    }
}
public class MyServletB extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("服务器拿到Cookie:");
        Cookie[] cookies = req.getCookies();
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                resp.getWriter().write(name + "------" + URLDecoder.decode(cookie.getValue(), "utf-8") + "  ");
            }
    }
}

Cookie的有效期

通过setMaxAge(int expiry)进行设置

  1. expiry为正数,单位为秒,浏览器会把Cookie写到硬盘中,只要还在expiry秒之前,登陆网站时该Cookie就有效。
  2. expiry为负数,浏览器不会把Cookie写到硬盘中,Cookie是临时性的,关闭浏览器就失效,默认值为-1。
  3. expiry为0,相当于删除Cookie。Cookie机制没有提供删除Cookie对应的方法,把expiry设置为0等同于删除Cookie。

Cookie的方法

setPath(String uri),只有该资源路径才能获取Cookie

Cookie记录上次登录时间

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = req.getCookies();
        if(cookies==null){
            resp.getWriter().write("第一次访问!");
        }else{
            resp.getWriter().write("上次访问时间:");
            for (Cookie cookie : cookies) {
                if ("previousTime".equals(cookie.getName())) {
                    System.out.println(cookie.getValue());
                    resp.getWriter().write(URLDecoder.decode(cookie.getValue(),"utf-8"));
                    break;
                }
            }
        }
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = simpleDateFormat.format(new Date());
        String encode = URLEncoder.encode(time,"utf-8");
        Cookie cookie=new Cookie("previousTime",encode);
        resp.addCookie(cookie);
    }

注意事项:

Cookie cookie=new Cookie(String name,String value)的name和value值不能包含中文,也不能包含特殊字符,比如英文分号(;)、英文逗号(,)、等号(=)、空格( )等。如果包含特殊符号,则会报500

如何包含中文或特殊字符呢?

解决方案:

方案:

设置Cookie时,先进行URLEncoder.encode(str,"utf-8"),获取Cookie时,再URLDecoder.decode(str,"utf-8")

设置Cookie的携带路径

子路径能访问到父路径设置的Cookie,但父路径无法访问到子路径设置的Cookie

说明:

localhost:8080/cookiepath/cookie的路径是"/cookiepath",localhost:8080/cookiepath/subcookiepath/cookie的路径是"/cookiepath/subcookiepath",前者对应的Servlet设置了Cookie,后者的Servlet是能获取到;反之,不能

设置JS禁止操作Cookie

public class CookieServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        Cookie cookie=new Cookie("name","zhangsan");
        //禁用JS操作Cookie
        cookie.setHttpOnly(true);
        response.addCookie(cookie);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        this.doPost(request,response);
    }
}
posted @ 2020-04-05 19:20  幻竹  阅读(193)  评论(0)    收藏  举报