Cookie

会话技术

指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。
简而言之:用户访问网站,关闭浏览器,这和个过程就叫会话。
会话过程要解决的问题
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。Servlet在会话过程中保存数据使用到的技术有两种:Cookie和Session技术。
比如京东,在用户没有登陆的情况下,就是通过cookie保存商品信息。
【小结】

  1. Cookie和Session技术都是在会话期间产生的 ;
  2. Cookie和Session的作用都是保存数据 ;

Cookie技术

Cookie英文意指饼干,Cookie就是服务器暂存放在我们电脑上的一笔资料(通过浏览器可以查看),使用我们电脑来保存一些服务器希望保存的内容。Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器前提是浏览器设置为启用cookie。
应用场景
登录页面记住密码的功能

用户名:
密码:
记住密码:

实现原理

Cookie_第1张图片步骤:

  1. 浏览器发送请求
  2. 服务器创建cookie并且响应cookie
  3. 浏览器自动保存cookie
  4. 浏览器再次发送请求时请求头中会携带cookie(不管第二次请求是servlet还是原页面)

Cookie常用API
Cookie的基本API包括Cookie的创建,往Cookie中添加数据,获取Cookie中的数据以及将Cookie响应给浏览器。
Cookie_第2张图片记住密码的后台代码

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户提交信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String check = request.getParameter("check");
        //用户是否点击
        if ("on".equals(check)){
            //用户点击了  创建cookie
            //创建cookieAPI
            Cookie cookieName = new Cookie("username",username);
            Cookie cookiePwd = new Cookie("pwd",password);
            //将cookie响应回浏览器
            response.addCookie(cookieName);
            response.addCookie(cookiePwd);
        }
    }
}

实践:获取request中的请求OtherServlet.java
登录成功之后,访问一个新的Servlet,在这个Servlet中获取请求携带的cookie。

@WebServlet("/other")
public class OtherServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取所有cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            //获取cookiename value
            System.out.println(cookie.getName());
            System.out.println(cookie.getValue());
        }
    }
}

结果:

Cookie中的 name=userName;value=zhangsan
Cookie中的 name=password;value=123
Cookie中的 name=JSESSIONID;value=AFEC20664FA3BB22DEC0E2E45684B039

关于cookie特殊字符问题

@WebServlet("/specialServlet")
public class SpecialServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //生成cookie
        //编码
        String str = "12  34";
        String encode = URLEncoder.encode(str, "utf-8");
        //特殊字符解决了。。。
        Cookie cookie = new Cookie("info",encode);
        response.addCookie(cookie);
    }
}

获取cookie

@WebServlet("/getServlet")
public class GetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取所有cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("info")){
                //获得编码后的cookie value
                String value = cookie.getValue();
                //解码
                String decode = URLDecoder.decode(value, "utf-8");
                System.out.println("decode = " + decode);
            }
        }
    }
}

Cookie的存活时间&有效路径
发现,将浏览器关闭,然后再打开一个新的浏览器,登录页面上记录的用户名和密码消失了,查看浏览器中的cookie,发现之前保存的cookie都消失了。再次登录发现之前设置的cookie的到期时间为“浏览器会话结束”
这样 有点麻烦,我们可以设置cookie的最大存活时间。
概念:
会话级别的Cookie:浏览器关闭后消失。
持久性的cookie:浏览器关闭后能保存一段时间。

Cookie的最大存活时间
方法:void setMaxAge(int seconds)

示例:userNameCookie.setMaxAge(60*60);

说明:
设置Cookie的有效时间:
如果没有设置,cookie只会保存在浏览器的缓存中,浏览器关闭后cookie立即被删除。
如果设置有效时间,在时间范围内,cookie被写入到浏览器端,关闭浏览器下次访问仍可活的,直到过期。

实践:将上述记住密码案例中的cookie的存活时间设置成1个月

@WebServlet("/chijiuhua")
public class PersisitenceServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置持久化cookie
        Cookie cookie = new Cookie("zhangsan","老张");
        cookie.setMaxAge(60*60*24*30);

        response.addCookie(cookie);
    }
}

Cookie的有效路径。
没有对cookie进行路径设置,默认/,项目各种url都可以访问这个cookie
对cookie进行路径的设置setPath("/web"),当前路径/web以及它子路径/web/a/b可以获取到这个cookie
Cookie的有效路径指的是cookie允许被访问的路径。设置路径,以及子路径都被允许访问。

实践:Cookie的有效路径
需求:
在CookieServlet1中创建一个Cookie,设置路径为“/web/a/b”;
新建一个CookieServlet2,映射路径为“/web/b”
新建一个CookieServlet3,映射路径为"/web/a/b";
新建一个CookieServlet4,映射路径为"/web/a/b/c";
新建一个CookieServlet4,映射路径为"/web/a/d";
分别在CookieServlet2,CookieServlet3,CookieServlet4,CookieServlet5中获取cookie;

@WebServlet("/path")
public class PathServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("path","testpath");
        //cookie设置路径
        cookie.setPath("/path");
        cookie.setMaxAge(60*60*24);
        response.addCookie(cookie);
    }
}

获取cookie
@WebServlet("/path/b/a")
public class PathTwoServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取cookie
        Cookie[] cookies = request.getCookies();

        for (Cookie c : cookies){
            //获取cookie的名字和值
            String name = c.getName();
            String value = c.getValue();
            System.out.println("name = " + name);
            System.out.println("value = " + value);
        }
    }
}

结果:
当给cookie设置有效路径"/web/a/b"后:

  1. 访问路径:/web 获取不到cookie;
  2. 访问路径:/web/a/b/c 能获取到cookie ;
  3. 访问路径:/web/a/b 能获取到cookie ;
  4. 访问路径:/web/a/d 获取不到;

【结论】
当设置cookie的有效路径后,只能在有效路径或其子路径下访问这个cookie;
如果不给cookie设置有效路径,默认的有效路径为"/",即在当前Tomcat下的任意访问路径均可以获取这个cookie。
一般情况下,不必给cookie设置有效路径。

Cookie删除
通常情况下,如果浏览器中的cookie存储的太多,我们需要手动清除浏览器中的cookie。这是通过客户端的技术删除存储在浏览器中的cookie。Servlet中没有专门提供API去删除cookie。我们可以通过以下方式删除cookie;

【操作步骤】

  1. 创建与要删除的cookie同名的cookie,将其值设置成"";
  2. 将这个cookie的最大存活时间设置成0;
  3. 设置这个cookie的有效路径(与原cookie的有效路径一致);
  4. 将这个新的cookie响应给浏览器,置换原来的cookie;
@WebServlet("/chi")
public class ChiServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //实现持久化session
        HttpSession session = request.getSession();
        //获取sessionid
        String id = session.getId();

        Cookie cookie = new Cookie("JSESSIONID",id);
        //是cookie持久化
        cookie.setMaxAge(60*30);

        //响应回浏览器
        response.addCookie(cookie);
    }
}

【小结】让cookie消失的几种方法

  1. 没有设置最大存活时间的cookie,浏览器关闭后cookie立即消失;
  2. 使用浏览器手动清除cookie;
  3. 浏览器禁用cookie;
  4. 通过Servlet技术将cookie删除;

总结:

  • Cookie:服务器在客户端(浏览器)存储数据的技术;
  • Cookie分类:
    • 会话级别:没有设置最大存活时间的cookie,浏览器关闭后消失;
    • 持久级别:设置了最大存活时间,浏览器关闭后不会消失;
  • Cookie基本API:
    • 创建Cookie:Cookie c = new Cookie(“name”,“zhangsan”);
    • 获取name值:c.getName();
    • 获取value值:c.getValue();
    • 将cookie响应给浏览器:response.add©;
    • 获取所有的cookie:Cookie[] cookies = request.getCookies();
  • Cookie的有效时间:
    • setMaxAge(int seconds):以秒为单位设置cookie的存活时间;
  • Cookie的有效路径:
    • setPath(String path):设置cookie的有效路径,在这个路径及其子路径下有效;
  • Cookie删除:
    • 客户端:
      • 会话级别的cookie,关闭浏览器后cookie立即消失;
      • 禁用cookie;
      • 手动清除cookie;
    • 服务端:
      • 通过Servlet,将原来的cookie置换;
  • Cookie的优势及弊端:
    • 优势:
      • 为服务端标识用户提供依据;
      • 减轻了服务端数据存储的压力;
    • 弊端:
      • 数据存储在客户端不安全;
      • 存储的数据大小受限,一个cookie存储的数据最大为4K;

·

你可能感兴趣的:(Web)