D13 Sping Boot 入门 Sping框架--Java Web之Cookie和Session

Posted 菜鸟的博客笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D13 Sping Boot 入门 Sping框架--Java Web之Cookie和Session相关的知识,希望对你有一定的参考价值。

1、Cookie(保存在客户端)

  Ⅰ、什么是Cookie

    

   Ⅱ、如何创建Cookie

    

    1、在com.gychen.web里新建CookieServlet.java并继承BaseServlet.java  

 1 package com.gychen.web;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.http.HttpServlet;
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7 import java.io.IOException;
 8 import java.lang.reflect.Method;
 9 
10 public abstract class BaseServlet extends HttpServlet {
11 
12     @Override
13     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
14 
15         //解决post中请求中文乱码问题
16         //一定要在获取请求参数之前调用
17         req.setCharacterEncoding("UTF-8");
18         //解决响应中请求中文乱码问题
19         resp.setContentType("text/html;charset=UTF-8");
20 
21         //判断页面的功能
22         String action = req.getParameter("action");
23 
24         //不用添加一个功能就写一个if,反射获取方法名
25         try {
26             //通过action业务鉴别字符串,获取相应的业务 方法反射对象
27             Method method = this.getClass().getDeclaredMethod
28                     (action,HttpServletRequest.class,HttpServletResponse.class);
29 
30             //调用目标业务方法
31             method.invoke(this,req,resp);
32         } catch (Exception e) {
33             e.printStackTrace();
34         }
35 
36     }
37 
38     @Override
39     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
40 
41         doPost(req,resp);
42 
43     }
44 }
BaseServlet.java
 1 package com.gychen.web;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.http.Cookie;
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7 import java.io.IOException;
 8 
 9 public class CookieServlet extends BaseServlet {
10     protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
11 
12         //1、创建cookie对象
13         Cookie cookie1 = new Cookie("key1","value1");
14         //2、通知客户端保存cookie
15         resp.addCookie(cookie1);
16 
17         //1、创建cookie对象
18         Cookie cookie2 = new Cookie("key2","value2");
19         //2、通知客户端保存cookie
20         resp.addCookie(cookie2);
21 
22         resp.getWriter().write("Cookie创建成功啦");
23     }
24 
25 
26 }
CookieServlet.java

    2、在web里新建cookie.html

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 2 <html>
 3 <head>
 4 <meta http-equiv="pragma" content="no-cache" />
 5 <meta http-equiv="cache-control" content="no-cache" />
 6 <meta http-equiv="Expires" content="0" />
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>Cookie</title>
 9     <base href="http://localhost:8080/Cookie_Session/">
10 <style type="text/css">
11 
12     ul li {
13         list-style: none;
14     }
15     
16 </style>
17 </head>
18 <body>
19     <iframe name="target" width="500" height="500" style="float: left;"></iframe>
20     <div style="float: left;">
21         <ul>
22             <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
23             <li><a href="" target="target">Cookie的获取</a></li>
24             <li><a href="" target="target">Cookie值的修改</a></li>
25             <li>Cookie的存活周期</li>
26             <li>
27                 <ul>
28                     <li><a href="" target="target">Cookie的默认存活时间(会话)</a></li>
29                     <li><a href="" target="target">Cookie立即删除</a></li>
30                     <li><a href="" target="target">Cookie存活3600秒(1小时)</a></li>
31                 </ul>
32             </li>
33             <li><a href="" target="target">Cookie的路径设置</a></li>
34             <li><a href="" target="target">Cookie的用户免登录练习</a></li>
35         </ul>
36     </div>
37 </body>
38 </html>
cookie.html

   Ⅲ、服务器如何获取Cookie

     request.getCookies(); //返回Cookie数组 

    查找指定名称的Cookie

    在com.gychen.utils里新建CookieUtils.java

 1 package com.gychen.utils;
 2 
 3 import javax.servlet.http.Cookie;
 4 
 5 public class CookieUtils {
 6 
 7     /**
 8      * 查找指定名称的Cookie对象
 9      * @param name 想要查找的cookie的key
10      * @param cookies cookies
11      * @return
12      */
13     public static Cookie findCookie(String name, Cookie[] cookies){
14 
15         if (name == null || cookies == null || cookies.length == 0){
16             return null;
17         }
18 
19         for (Cookie cookie : cookies) {
20             if (name.equals(cookie.getName())){
21                 return cookie;
22             }
23         }
24 
25         return null;
26     }
27 }
CookieUtils.java

    在CookieServlet.java中调用CookieUtils中的方法来查询cookie

 1 package com.gychen.web;
 2 
 3 import com.gychen.utils.CookieUtils;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.Cookie;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import java.io.IOException;
10 
11 public class CookieServlet extends BaseServlet {
12 
13     /**
14      * 创建cookie
15      */
16     protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
17 
18         //1、创建cookie对象
19         Cookie cookie1 = new Cookie("key1","value1");
20         //2、通知客户端保存cookie
21         resp.addCookie(cookie1);
22 
23         //1、创建cookie对象
24         Cookie cookie2 = new Cookie("key2","value2");
25         //2、通知客户端保存cookie
26         resp.addCookie(cookie2);
27 
28         resp.getWriter().write("Cookie创建成功啦");
29     }
30 
31 
32     /**
33      * 服务器获取cookie
34      */
35     protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
36 
37         Cookie[] cookies = req.getCookies();
38 
39         for (Cookie cookie : cookies) {
40 //            System.out.println(cookie);
41 //            //输出给客户端
42             resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br />");
43 
44         }
45 
46 
47         //查找想要的cookie
48         //法一:
49         Cookie iwantCookie = null;
50         for (Cookie cookie : cookies) {
51             //输出给客户端
52             resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br />");
53             if ("key2".equals(cookie.getName())) {
54                 iwantCookie = cookie;
55                 break;
56             }
57         }
58 
59         //如果不等于null,说明赋过值,也就是找到了需要的Cookie
60         if (iwantCookie != null) {
61             resp.getWriter().write("找到了需要的key2="+iwantCookie.getValue());
62         }
63 
64         //法二:
65         Cookie iwantCookie2 = CookieUtils.findCookie("key1",cookies);
66         resp.getWriter().write("<br/>找到key1="+iwantCookie2.getValue());
67     }
68 }
CookieServlet.java

  Ⅳ、修改Cookie值

    
 1 /**
 2      * 修改cookie值
 3      */
 4     protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         //方案一
 6 //        ①、先创建一个要修改的同名的Cookie对象。
 7 //     ②、在构造器,同时赋予新的Cookie值。
 8         Cookie cookie = new Cookie("key1","newValue1");
 9 //     ③、调用response.assCookie(Cookie)。
10         resp.addCookie(cookie);
11         resp.getWriter().write("key1已修改");
12 
13     }
方案一:

      ①、先创建一个要修改的同名的Cookie对象。

      ②、在构造器,同时赋予新的Cookie值。

      ③、调用response.addCookie(Cookie)通知客户端保存修改。   

    
 1  /**
 2      * 修改cookie值
 3      */
 4     protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5 
 6         //方案二:
 7 //     ①、先查找到需要修改的Cookie对象。
 8         Cookie cookie = CookieUtils.findCookie("key2",req.getCookies());
 9         if (cookie != null){
10 //     ②、调用setValue()方法赋予新的Cookie值。
11             cookie.setValue("newValue2");
12 //     ③、调用response.assCookie(Cookie)通知客户端保存修改。
13             resp.addCookie(cookie);
14             resp.getWriter().write("key2已修改");
15         }
16 
17 
18     }
方案二:

      ①、先查找到需要修改的Cookie对象。

      ②、调用setValue()方法赋予新的Cookie值。

      ③、调用response.addCookie(Cookie)通知客户端保存修改。

  Ⅴ、Cookie生命周期控制

    Cookie的生命周期控制指的是如何管理Cookie什么时候被销毁(删除)

    public void setMaxAge(int expiry) //设置cookie的最大生存时间,以秒为单位。  

    参数为

      正数:表示指定的秒数后过期。

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

      零:表示马上删除Cookie。

 1     /**
 2      * Cookie生命控制:浏览器关闭后删除
 3      * 负数:表示浏览器一关,Cookie就会被删除(默认值-1)。
 4      */
 5     protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 6 
 7 //        setMaxAge(int expiry)参数为
 8 //      正数:表示指定的秒数后过期。
 9 //      负数:表示浏览器一关,Cookie就会被删除(默认值-1)。
10 //      零:表示马上删除Cookie。
11         Cookie cookie = new Cookie("defaultLife","defaultLife");
12         //设置最大生存时间
13         cookie.setMaxAge(-1);
14         resp.addCookie(cookie);
15         resp.getWriter().write(cookie.getValue());
16 
17     }
18 
19 
20     /**
21      * Cookie生命控制:立即删除
22      * 零:表示马上删除Cookie。
23      */
24     protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
25 
26 //        setMaxAge(int expiry)参数为
27 //      正数:表示指定的秒数后过期。
28 //      负数:表示浏览器一关,Cookie就会被删除(默认值-1)。
29 //      零:表示马上删除Cookie。
30         Cookie cookie = CookieUtils.findCookie("key1",req.getCookies());
31         if (cookie != null) {
32             //设置最大生存时间
33             cookie.setMaxAge(0);
34             resp.addCookie(cookie);
35             resp.getWriter().write(cookie.getValue()+"已删除");
36         }
37 
38 
39     }
40 
41 
42     /**
43      * Cookie生命控制:1小时后删除
44      * 正数:表示指定的秒数后过期。
45      */
46     protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
47 
48 //        setMaxAge(int expiry)参数为
49 //      正数:表示指定的秒数后过期。
50 //      负数:表示浏览器一关,Cookie就会被删除(默认值-1)。
51 //      零:表示马上删除Cookie。
52         Cookie cookie = new Cookie("life3600","life3600");
53         //设置最大生存时间
54         cookie.setMaxAge(3600);
55         resp.addCookie(cookie);
56         resp.getWriter().write(cookie.getValue());
57 
58     }
Cookie生命控制

  Ⅵ、Cookie有效路径Path的设置

  Cookie的Path属性可以有效的过滤哪些cookie可以发送给服务器,哪些不发。

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

  

 1 /**
 2      * Cookie的Path属性
 3      */
 4     protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5 
 6         Cookie cookie = new Cookie("path","path");
 7         cookie.setPath(req.getContextPath()+"/abc");   //工程名/abc
 8         resp.addCookie(cookie);
 9         resp.getWriter().write(req.getContextPath()+"/abc");
10     }
Cookie的Path属性

  Ⅶ、Cookie练习--免用户名登录

 

     ①、新建login.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>免用户名登录</title>
 5 </head>
 6 <body>
 7 
 8 <form action="loginServlet" method="get">
 9     用户名:<input type="text" name="username" id="username" value="${cookie.username.value}"><br>
10     密码:<input type="password" name="password" id="password"><br>
11     <input type="submit" value="登录">
12 </form>
13 
14 </body>
15 </html>
login.jsp

    ②、新建LoginServlet.java

 1 package com.gychen.web;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.http.Cookie;
 5 import javax.servlet.http.HttpServlet;
 6 import<

以上是关于D13 Sping Boot 入门 Sping框架--Java Web之Cookie和Session的主要内容,如果未能解决你的问题,请参考以下文章

D08 Sping Boot 入门 Sping框架--Java Web之JSP

D16 Sping Boot 入门 Sping框架--Java Web之书城项目 dingda模块

D16 Sping Boot 入门 Sping框架--Java Web之书城项目 dingda模块

D17 Sping Boot 入门 Sping框架--Java Web之Filter过滤器

D17 Sping Boot 入门 Sping框架--Java Web之Filter过滤器

D09 Sping Boot 入门 Sping框架--Java Web之El表达式和JSTL标签