zoukankan      html  css  js  c++  java
  • 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 技术来实现的。

  • 相关阅读:
    PHP PDO
    常用JavaScript字符串方法简述
    命名
    jquery远程班备忘
    html历史
    CSS3的翻转效果
    正则
    排序算法
    firebug的调试,console
    跨域
  • 原文地址:https://www.cnblogs.com/nuister/p/12663096.html
Copyright © 2011-2022 走看看