Cookie知多少?

一、什么是cookie?
①:Cookie翻译过来是饼干.
②:Cookie是服务器通知客户端保存键值对的一种技术.
③:每个 Cookie的大小不能超过4kb
④:每次请求的时候,只要客户端有Cookie,都会被发送给服务器.

二、如何创建Cookie?
①:在服务器端new Cookie( name, value ) ;
②:调用 response.addCookie( cookie ); 通知客户端Cookie 保存( 或修改 )

 /**
     * 创建cookie
     * @param request
     * @param response
     */
    public void createCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        1、创建cookie,只有有参构造
        Cookie cookie = new Cookie("key","value");
//        2、调用 response.addCookie( cookie ); 通知客户端Cookie 保存( 或修改 )
        response.addCookie(cookie);

        Cookie cookie1 = new Cookie("cccKey","cccValue");
        response.addCookie(cookie1);

        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("已经创建cookie,并返回");
    }

三、服务器如何获取客户端发送过来的Cookie?
①:当浏览器向服务器发送请求时,浏览器中有cookie,只要发请求,就会将cookie的相关信息发送给服务器(通过请求头)
②:服务器获取浏览器中传递的cookie,只需要使用api—》request.getCookies():Cookie[] 即可得到全部Cookie
// cookie.getName() 获取Cookie的键或名称 值
// cookie.getValue() 获取当前Cookie的值

/**
     * 获取创建的cookie信息
     * @param request
     * @param response
     * @throws IOException
     */
    public void getCookies(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=UTF-8");
//        1、获取前台传递的所有cookie
        Cookie[] cookies = request.getCookies();
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie:cookies) {
//                2、将获取到的cookie具体信息写到页面展示
                response.getWriter().write(cookie.getName() +":"+ cookie.getValue() + "<br/>");
            }
        }

//        3、获取具体的cookie
        Cookie cookie = CookieUtils.findCookie("key",cookies);
        if(cookie != null){
            System.out.println(cookie.getName());
            response.getWriter().write("亲爱的.我找到了你要的Cookie <br>");
        }
    }

四、cookie值得修改
①:
直接在服务器端创建一个同名的cookie对象,
在创建的构造器方法中直接赋于新值,
调用 response.addCookie( cookie ); 通知客户端保存修改
②:
先查找到需要修改的Cookie对象
调用 setValue() 方法设置新的值
调用 response.addCookie() 通知客户端保存

 /**
     * 修改cookie
     * @param request
     * @param response
     */
    public void upCookie(HttpServletRequest request, HttpServletResponse response){
        /**
         * 方案一:
         * 1 直接在服务器端创建一个同名的cookie对象   === 修改aaa值为aaaNewValue
         * 2 在创建的构造器方法中直接赋于新值
         */
        Cookie cookie = new Cookie("cccKey","cccNewKey");
        response.setContentType("text/html;charset=UTF-8");
        response.addCookie(cookie);

        /**
         * 方案二:
         * 1 先查找到需要修改的Cookie对象
         * 2 调用 setValue() 方法设置新的值
         * 3 调用 response.addCookie() 通知客户端保存
         */
        Cookie cookie1 = CookieUtils.findCookie("key",request.getCookies());
//        注意:如果Cookie值为中文,建议使用BASE64编码后再保存
        cookie1.setValue("newValue");
        response.addCookie(cookie1);
    }

五、cookie得生命周期
Cookie也是有存活时长的.Cookie的存活时长由一个api设置决定.
setMaxAge()
1 正数 表示浏览器在指定的秒数后被删除 ( 或失效 )
2 负数 表示浏览器关闭,Cookie就会被删除( 默认值也是-1 )
3 零 表示浏览器收到响应后,马上删除Cookie

 /**
     * 设置cookie声明周期
     * setMaxAge()
     * 		1 正数		表示浏览器在指定的秒数后被删除 ( 或失效 )
     * 		2 负数		表示浏览器关闭,Cookie就会被删除( 默认值也是-1 )
     * 		3 零		表示浏览器收到响应后,马上删除Cookie
     * @param request
     * @param response
     */
    public void cookieLife(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        1、创建cookie
        Cookie cookie = new Cookie("life3600","life3600");
//        2、设置cookie的存活时间
        cookie.setMaxAge(60 * 60);
        response.addCookie(cookie);
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("创建一个可以存活一小时的cookie");
    }

六、Cookie有效路径Path的设置
Cookie的path路径,可以设置Cookie在哪些请求下才发送给服务器.
①:Cookie1 的path为: /工程路径 表示请求地址为: http://ip:port/工程路径/所有资料 都会发送给服务器.
②:cookie2 的path为:/工程路径/abc 表示请求地址为: http://ip:port/工程路径/abc/* 都会发给服器.
示例:
比如现在有两个Cookie
CookieA path=/工程路径
CookieB path/工程路径/abc
请求有以下几个:
http://ip:port/工程路径/a.html
CookieA 会发
CookieB 不发
http://ip:port/工程路径/abc/a.html
CookieA 会发
CookieB 会发

 /**
     * 测试cookie有效路径的设置
     * @param request
     * @param response
     * @throws IOException
     */
    public void testCookiePath(HttpServletRequest request, HttpServletResponse response) throws IOException {

        response.setContentType("text/html;charset=UTF-8");

        Cookie cookieA = new Cookie("cookieAKey","cookieAValue");
//        cookieA设置的路径为:/atguigu8_cookieAndsession    其也是默认值
        cookieA.setPath(request.getContextPath());
        response.addCookie(cookieA);

        Cookie cookieB = new Cookie("cookieBKey","cookieBValue");
//       cookieB设置的路径为:/atguigu8_cookieAndsession/abc
        cookieB.setPath(request.getContextPath() + "/abc");
        response.addCookie(cookieB);
        response.getWriter().write("创建了两个Cookie用于对比");
    }
}

七、免输入用户名登录—使用cookie完成的功能
免用户名登录指的是,一个表单.当用户第一次访问的时候,是需要登录的.第一次登录成功后.
用户名就会被记录下来.当用户第二次访问的时候,这个表单里就会直接有之前登录的用户名信息,只需要输入密码即可.

/**
 * 免 用户名登录
 */
@WebServlet(name = "UserServlet" ,urlPatterns = "/userServlet")
public class UserServlet extends HttpServlet{

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if("admin".equals(username) && "admin".equals(password)){
            Cookie cookie = new Cookie("username",username);
//            设置cookie存活周期为一周
            cookie.setMaxAge(60 * 60 * 24 * 7);
            resp.addCookie(cookie);
            resp.getWriter().write("登录成功");
        }else {
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面-</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/userServlet" method="post">
        用户名:<input type="text" id="username" name="username" value="${cookie.username.value}" /><br>
        密码:<input type="password" name="password" id="password" /> <br>
        <input type="submit" value="免用户名登录">
    </form>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/shkstart/article/details/108198097