【JavaWeb 实际项目_Cookie&Session 06】

一、Cookie

1、什么是Cookie

cookie是服务器通知客户端保存键值对的一种技术

客户端有了cookie以后,每次请求都发送给服务器

每个cookie的大小都不能超过4kb

2、如何创建Cookie

1)创建cookie-session的JavaWeb项目-->com.wufq.servelt包-->CookieServlet类、BaseServlet类(导入book已有的)

2)修改web.xml的请求路径

 <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>com.wufq.servlet.CookieServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>

3)修改cookie.html的请求地址

<title>Cookie</title>
    <base href="http://localhost:8080/cookie_session/">
<style type="text/css">

    ul li {
        list-style: none;
    }
    
</style>
</head>
<body>
    <iframe name="target" width="500" height="500" style="float: left;"></iframe>
    <div style="float: left;">
        <ul>
            <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
            <li><a href="" target="target">Cookie的获取</a></li>
            <li><a href="" target="target">Cookie值的修改</a></li>
            <li>Cookie的存活周期</li>

4)CookieServlet类创建createCookie方法(实现cookie对象的实现)

public class CookieServlet extends BaseServlet{

    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1、创建cookie对象
        Cookie cookie = new Cookie("key1", "value1");
        //2、通知客户端保存cookie
        resp.addCookie(cookie);
        
        resp.getWriter().write("Cookie创建成功!");
    }

5)启动程序以后,测试发现:存在两个问题:

5.1)显示到浏览器上面的中文出现乱码

5.2) cookie可以一次创建多个cookie,并且一定要用response.addCookie(cookie)通知客户端,否则客户端接收不到cookie信息

解决这两个问题的方法:

第一个问题的解决方法:在BaseServlet的doPost请求内加上

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        //解决post请求中文乱码问题
        //一定要在获取请求参数调用之前执行才有效
        req.setCharacterEncoding("UTF-8");
        //解决响应中文的乱码问题
        resp.setContentType("text/html;charset=UTF-8");

        try {
//          //通过反射获取login,regist方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            //调用方法
            method.invoke(this,req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

第二个问题实现的方式:

在CookieServlet类内多创建几个Cookie对象

        Cookie cookie2 = new Cookie("key2", "value2");
        resp.addCookie(cookie2);
        
        Cookie cookie3 = new Cookie("key3", "value3");
        resp.addCookie(cookie3);

验证:响应头Set-cookie保存cookie的键值对

3、cookie的获取

1)服务器获取客户端的Cookie只需要一行代码:req.getCookie():Cookie[]

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        for(Cookie cookie : cookies) {
            /*
            *
             * cookie.getName() 获取cookie的key
             * cookie.getValue() 获取cookie的value
            */
            resp.getWriter().write("Cookie[ "+cookie.getName()+":"+cookie.getValue()+" ]"+"</br>");
        }
        Cookie iWantCookie = CookieUtil.findCookie("key2",cookies);
        
        if (iWantCookie != null) {
            resp.getWriter().write("找到了需要cookie");
        }
    }

除了去获取全部的cookie,在实际项目中还常用cookie的key去查找对应的值==>这种通用的方法一般会写成工具类

cookieUtil类

public class CookieUtil {

    public static Cookie findCookie(String name,Cookie[] cookies){
        if(name == null||cookies==null||cookies.length == 0){
            return null;
        }
        for(Cookie cookie : cookies) {
            if (cookie.getName().equals(name)) {
                return cookie;
            }
        }
        return null;
    }
}

4、修改cookie

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       /*
       * 第一种方式:
       * 1、创建一个要修改的同名的cookie对象
       * 2、在构造器内重新赋值
       * 3、把cookie返回给浏览器
        */
        Cookie cookie = new Cookie("key1", "newValue1");
        resp.addCookie(cookie); 

        /*
        * 第二种方式:
        * 1、查找到cookie的值
        * 2、用setCookie修改
        * 3、返回给浏览器
        */
        Cookie key2 = CookieUtil.findCookie("key2", req.getCookies());
        key2.setValue("newValue2");
        resp.addCookie(key2);
    }

5、Cookie的生命控制

指的设置cookie的失效时间

setMaxAge()  -->主要由这个方法控制

正数:表示在指定的描述后过期

负数:表示浏览器一关,Cookie就会被删除(默认值是-1)

零:表示马上删除

 protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("default","default");
        cookie.setMaxAge(-1);
        resp.addCookie(cookie);
    }
    protected void nowDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("nowDelete","nowDelete");
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
        resp.getWriter().write("nowDelete被删除");
    }

    protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("life3600","life3600");
        cookie.setMaxAge(30);
        resp.addCookie(cookie);
        resp.getWriter().write("life3600");
    }

6、cookie有效路径Path设置

cookie的path属性可以有效的过滤那些cookie可以发送给服务器,那些不发

path属性通过请求地址来进行有效的过滤

比如:

cookieA   path:/工程名

cookie    path: /工程名/abc

请求的地址如下:http://localhost:8080/工程名/a.html

cookieA和CookieB都发送

http://localhost:8080/工程名/abc/a.html

cookieA不发送,CookieB发送

protected void pathCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("path","path");
        cookie.setPath(req.getContextPath()+"/abc");
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个带path路径的cookie");
    }

#Cookie练习:免输入用户名登录

原文地址:https://www.cnblogs.com/frankruby/p/15107860.html