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 javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import java.io.IOException;
 9 
10 public class LoginServlet extends HttpServlet {
11 
12     @Override
13     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
14 
15         String username = req.getParameter("username");
16         String password = req.getParameter("password");
17 
18         //判断用户名和密码正确性
19         if ("gychen".equals(username) && "123456".equals(password)){
20 
21             //登录成功
22             Cookie cookie = new Cookie("username",username);
23             //设置当前Cookie一周内有效
24             cookie.setMaxAge(60*60*24*7);
25             resp.addCookie(cookie);
26             System.out.println("login success");
27         }else {
28             //登录失败
29             System.out.println("login failed");
30         }
31     }
32 }
LoginServlet.java

2、Session(保存在服务器端)

  Ⅰ、什么是Session会话

    ①、Session就是一个接口(HttpSession)。

    ②、Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。

    ③、每个客户端都有一个自己的Session会话。

    ④、Session会话中,我们经常用来保护用户登录之后的信息。

   Ⅱ、如何创建和获取Session(API一样)

request.getSession();//第一次调用是创建Session对话。之后调用都是获取前面创建号的Session会话对象。  

1 isNew();//判断是否是新创建的
2 // true:表示刚创建
3 //false:表示之前创建

    每个Session都有一个唯一的身份id,通过 getId(); 获取。

  Ⅲ、Session域数据的存取

 1  /**
 2      * 往session域中保存数据
 3      * @param req 请求
 4      * @param resp 响应
 5      */
 6     protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
 7 
 8         req.getSession().setAttribute("key1","value1");
 9         resp.getWriter().write("key1已创建");
10     }
11 
12 
13     /**
14      * 获取Session域中的数据
15      * @param req 请求
16      * @param resp 响应
17      */
18     protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
19 
20         Object attribute = req.getSession().getAttribute("key1");
21         resp.getWriter().write("从session域中获取出key1的值是:"+attribute);
22 
23     }
Session域数据的存取

  Ⅳ、Session生命周期控制 

public void setMaxInactiveInterval(int interval);//设置的超时时间(以秒为单位),超过指定时长,Session就会被销毁。 

  值为正数的时候,设定 Session 的超时时长。

  负数表示永不超时(极少使用)

Session超时指的是客户端两次请求的最大间隔时长。

public void session.getMaxInactiveInterval();//获取session的超时时长 

public void invalidate(); //让当前 Session 会话马上超时无效。 

如果说。你希望你的 web 工程,默认的 Session 的超时时长为其他时长。你可以在你自己的 web.xml 配置文件中做
以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长。
1 <!--表示当前 web 工程。创建出来 的所有 Session 默认是 20 分钟 超时时长-->
2 <session-config> 
3     <session-timeout>20</session-timeout> 
4 </session-config>
 1 /**
 2      * Session生命周期控制
 3      * Session的默认超时时长 tomcat默认1800s、30min、可以在web.xml里改
 4      * @param req 请求
 5      * @param resp 响应
 6      */
 7     protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws IOException {
 8 
 9        //获取Session默认的超时时长
10 
11         int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
12         resp.getWriter().write("Session的默认超时时长是:"+maxInactiveInterval+"s");
13 
14     }
15 
16 
17     /**
18      * Session生命周期控制
19      * Session 3s 超时销毁
20      * @param req 请求
21      * @param resp 响应
22      */
23     protected void life3(HttpServletRequest req, HttpServletResponse resp) throws IOException {
24 
25         //先获取Session会话对象
26         HttpSession session = req.getSession();
27 
28         //设置当前Session 3s 后超时
29         session.setMaxInactiveInterval(3);
30         resp.getWriter().write("当前Session 3s 后超时销毁");
31 
32     }
33 
34 
35     /**
36      * Session生命周期控制
37      * Session 立即销毁
38      * @param req 请求
39      * @param resp 响应
40      */
41     protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws IOException {
42 
43         //先获取Session会话对象
44         HttpSession session = req.getSession();
45 
46         //设置当前Session 立即超时
47         session.invalidate();
48         resp.getWriter().write("当前Session 立即销毁");
49 
50     }
Session生命周期控制

Ⅴ、浏览器和 Session 之间关联的技术内幕

  Session 技术,底层其实是基于 Cookie 技术来实现的。

 

posted @ 2020-04-08 21:49  nuister  阅读(215)  评论(0编辑  收藏  举报