JavaWeb-07-WEB的監聽器和cookie以及session

Table of Contents

 

監聽器和cookie以及session

五:監聽器

1 、什麼是 Listener 監聽器

2 、ServletContextListener 監聽器

2.1:ServletContextListener 監聽器,一定要在 web.xml 文件中配置之後纔會生效

2.2:生命週期監聽器兩個方法:

六:Cookie

1:Cookie

1.1:什麼是 Cookie?

1.2:如何創建 Cookie

1.3:服務器如何獲取 Cookie

1.4:Cookie 值的修改 值的修改

1.5:瀏覽器查看cookie

1.6:Cookie 生命控制 

六:Session會話

1:什麼是 Session  會話?

2:如何創建 Session  和獲取(id  號, 是否爲新)

2.1request.getSession()

2.2:isNew(); 判斷到底是不是剛創建出來的(新的)

2.3:getId() 得到 Session 的會話 id 值。

3:Session 域數據的存取

3.1:向Session中存數據

3.2:從Session中取數據

4:Session 生命週期控制

4.1Session 默認的超時時長是多少!Session 默認的超時時間長爲 30 分鐘。

4.2:修改默認Session超時時間

4.3:設置Session超時時間

5:  瀏覽器和 Session 之間關聯的技術內幕

七:Filter 過濾器

1:什麼是Filter過濾器

2:簡單體驗Filter

3:Filter 生命週期

4:FilterConfig 類

5:FilterChain 過濾鏈

6:Filter攔截路徑


監聽器和cookie以及session

五:監聽器

1 、什麼是 Listener 監聽器

什麼是監聽器?監聽器就是實時監視一些事物狀態的程序,我們稱爲監聽器。就好像朝陽羣衆?朝陽區只要有哪個明星有什麼不好的事,他們都會知道,然後舉報。
那麼朝陽羣衆就是監聽器,明星就是被監視的事物,舉報就是響應的內容。又或者說是,電動車的報警器。當報警器鎖上的時候。我們去碰電動車,電動車就會報警。報警器,就是監聽器,電動車就是被監視的對象。報警就是響應的內容。

 

1、Listener 監聽器它是 JavaWeb 的三大組件之一。JavaWeb 的三大組件分別是:Servlet 程序、Filter 過濾器、Listener 監
聽器。
2、Listener 它是 JavaEE 的規範,就是接口
3、監聽器的作用是,監聽某種事物的變化。然後通過回調函數,反饋給客戶(程序)去做一些相應的處理。

2 、ServletContextListener 監聽器

ServletContextListener 它可以監聽 ServletContext 對象的創建和銷燬。
ServletContext 對象在 web 工程啓動的時候創建,在 web 工程停止的時候銷燬。
監聽到創建和銷燬之後都會分別調用 ServletContextListener 監聽器的方法反饋。

監聽器的使用步驟。

第一步:我們需要定義一個類。然後去繼承生命週期的監聽器接口。
第二步:然後在 Web.xml 文件中配置。

2.1:ServletContextListener 監聽器,一定要在 web.xml 文件中配置之後纔會生效

<listener>
<listener-class>全類名</listener-class>
</listener>

 

2.2:生命週期監聽器兩個方法:

我們以 ServletContext 的監聽器爲例演示如下:

package com.wkl.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * Description:
 * Date:       2020/6/14 - 下午 10:53
 * author:     wangkanglu
 * version:    V1.0
 */
public class SerletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext 對象被創建了");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext 對象被銷燬了");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- servlet 標籤給 Tomcat 配置 Servlet 程序 -->
    <servlet>
        <!--servlet-name 標籤 Servlet 程序起一個別名(一般是類名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class 是 Servlet 程序的全類名 -->
        <servlet-class>com.wkl.servlet.HelloServlet</servlet-class>
        <init-param>
            <!-- 是參數名 -->
            <param-name>username</param-name>
            <!-- 是參數值 -->
            <param-value>root</param-value>
        </init-param>
    </servlet>
    <!--servlet-mapping 標籤給 servlet 程序配置訪問地址 -->
    <servlet-mapping>
        <!--servlet-name 標籤的作用是告訴服務器,我當前配置的地址給哪個 Servlet 程序使用 -->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 標籤配置訪問地址 <br/>
        / 斜槓在服務器解析的時候,表示地址爲: http://ip:port/ 工程路徑 <br/>
        /hello 表示地址爲: http://ip:port/ 工程路徑 /hello <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
    <listener>
        <listener-class>com.wkl.listener.SerletContextListener</listener-class>
    </listener>
</web-app>

 

六:Cookie

1:Cookie

1.1:什麼是 Cookie?

1、Cookie 翻譯過來是餅乾的意思。
2、Cookie 是服務器通知客戶端保存鍵值對的一種技術。
3、客戶端有了 Cookie 後,每次請求都發送給服務器。
4、每個 Cookie 的大小不能超過 4kb

1.2:如何創建 Cookie

package com.wkl.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Description:
 * Date:       2020/6/14 - 下午 9:10
 * author:     wangkanglu
 * version:    V1.0
 */
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 它會同時設置服務器和客戶端都使用 UTF-8 字符集,還設置了響應頭
        // 此方法一定要在獲取流對象之前調用纔有效
        resp.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("我知道了,回去吧");
        //1 創建 Cookie 對象
        Cookie cookie = new Cookie("key4", "value4");
        //2 通知客戶端保存 Cookie
        resp.addCookie(cookie);
        //1 創建 Cookie 對象
        Cookie cookie1 = new Cookie("key5", "value5");
        //2 通知客戶端保存 Cookie
        resp.addCookie(cookie1);
        resp.getWriter().write("Cookie  創建成功");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet的post方法被請求了。。。");
    }

}

1.3:服務器如何獲取 Cookie

服務器獲取客戶端的 Cookie 只需要一行代碼:req.getCookies():Cookie[]

package com.wkl.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Description:
 * Date:       2020/6/14 - 下午 9:10
 * author:     wangkanglu
 * version:    V1.0
 */
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 它會同時設置服務器和客戶端都使用 UTF-8 字符集,還設置了響應頭
        // 此方法一定要在獲取流對象之前調用纔有效
        resp.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("我知道了,回去吧");

        //獲取cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
        //// getName 方法返回 Cookie 的 key (名)
        //// getValue 方法返回 Cookie 的 value 值
        resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
        
         }
        
        //1 創建 Cookie 對象
        Cookie cookie = new Cookie("key4", "value4");
        //2 通知客戶端保存 Cookie
        resp.addCookie(cookie);
        //1 創建 Cookie 對象
        Cookie cookie1 = new Cookie("key5", "value5");
        //2 通知客戶端保存 Cookie
        resp.addCookie(cookie1);
        resp.getWriter().write("Cookie  創建成功");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet的post方法被請求了。。。");
    }

}

1.4:Cookie 值的修改 值的修改

方案一:
1、先創建一個要修改的同名(指的就是 key)的 Cookie 對象
2、在構造器,同時賦於新的 Cookie 值。
3、調用 response.addCookie( Cookie );

Cookie cookie = new Cookie("key1","newValue1");
// 3 、調用 response.addCookie( Cookie ); 通知 客戶端 保存修改
resp.addCookie(cookie);

方案二:
1、先查找到需要修改的 Cookie 對象
2、調用 setValue()方法賦於新的 Cookie 值。
3、調用 response.addCookie()通知客戶端保存修改

方案二:
// 1 、先查找到需要修改的 Cookie 對象
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
if (cookie != null) {
// 2 、調用 setValue() 方法賦於新的 Cookie 值。
cookie.setValue("newValue2");
// 3 、調用 response.addCookie() 通知客戶端保存修改
resp.addCookie(cookie);
}

1.5:瀏覽器查看cookie

 

1.6:Cookie 生命控制 

setMaxAge()
正數,表示在指定的秒數後過期
負數,表示瀏覽器一關,Cookie 就會被刪除(默認值是-1)
零,表示馬上刪除 Cookie

Cookie cookie = new Cookie("life3600", "life3600");
cookie.setMaxAge(60 * 60); // 設置 Cookie 一小時之後被刪除。無效
resp.addCookie(cookie);
resp.getWriter().write(" 已經創建了一個存活一小時的 Cookie");
// 先找到你要刪除的 Cookie 對象
Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());
if (cookie != null) {
// 調用 setMaxAge(0);
cookie.setMaxAge(0); // 表示馬上刪除,都不需要等待瀏覽器關閉
// 調用 response.addCookie(cookie);
resp.addCookie(cookie);
resp.getWriter().write("key4 的 的 Cookie  已經被刪除");
}
Cookie cookie = new Cookie("defalutLife","defaultLife");
cookie.setMaxAge(-1);// 設置存活時間
resp.addCookie(cookie);

六:Session會話

1:什麼是 Session  會話?

1、Session 就一個接口(HttpSession)。
2、Session 就是會話。它是用來維護一個客戶端和服務器之間關聯的一種技術。
3、每個客戶端都有自己的一個 Session 會話。
4、Session 會話中,我們經常用來保存用戶登錄之後的信息。

2:如何創建 Session  和獲取(id  號, 是否爲新)

如何創建和獲取 Session。它們的 API 是一樣的。

2.1request.getSession()

第一次調用是:創建 Session 會話
之後調用都是:獲取前面創建好的 Session 會話對象。

2.2:isNew(); 判斷到底是不是剛創建出來的(新的)

true 表示剛創建
false 表示獲取之前創建
每個會話都有一個身份證號。也就是 ID 值。而且這個 ID 是唯一的。

2.3:getId() 得到 Session 的會話 id 值。

3:Session 域數據的存取

3.1:向Session中存數據

req.getSession().setAttribute("key1", "value1");
resp.getWriter().write(" 已經往 Session  中保存了數據");

3.2:從Session中取數據

Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("從 從 Session  中獲取出 key1  的數據是:" + attribute);

4:Session 生命週期控制

  • public void setMaxInactiveInterval(int interval) 設置 Session 的超時時間(以秒爲單位),超過指定的時長,Session就會被銷燬。

值爲正數的時候,設定 Session 的超時時長。
負數表示永不超時(極少使用)

  • public int getMaxInactiveInterval()獲取 Session 的超時時間
  • public void invalidate() 讓當前 Session 會話馬上超時無效

4.1Session 默認的超時時長是多少!Session 默認的超時時間長爲 30 分鐘。

因爲在Tomcat服務器的配置文件web.xml中默認有以下的配置,它就表示配置了當前Tomcat服務器下所有的Session
超時配置默認時長爲:30 分鐘。
<session-config>
<session-timeout>30</session-timeout>
</session-config>

4.2:修改默認Session超時時間

如果說。你希望你的 web 工程,默認的 Session 的超時時長爲其他時長。你可以在你自己的 web.xml 配置文件中做
以上相同的配置。就可以修改你的 web 工程所有 Seession 的默認超時時長

<!-- 表示當前 web 工程。創建出來 的所有 Session 默認是 20 分鐘 超時時長 -->
<session-config>
<session-timeout>20</session-timeout>
</session-config>

 

4.3:設置Session超時時間

如果你想只修改個別 Session 的超時時長。就可以使用上面的 API。setMaxInactiveInterval(int interval)來進行單獨的設置。
session.setMaxInactiveInterval(int interval)單獨設置超時時長。

// 先獲取 Session 對象
HttpSession session = req.getSession();
// 設置當前 Session3 秒後超時
session.setMaxInactiveInterval(3);
resp.getWriter().write(" 當前 Session  已經設置爲 3  秒後超時");

 

5:  瀏覽器和 Session 之間關聯的技術內幕

Session 技術,底層其實是基於 Cookie 技術來實現的

 

七:Filter 過濾器

1:什麼是Filter過濾器

1、Filter 過濾器它是 JavaWeb 的三大組件之一。三大組件分別是:Servlet 程序、Listener 監聽器、Filter 過濾器
2、Filter 過濾器它是 JavaEE 的規範。也就是接口
3、Filter 過濾器它的作用是: 攔截請求,過濾響應。

攔截請求常見的應用場景有:
1、權限檢查
2、日記操作
3、事務管理
……等等

2:簡單體驗Filter

要求:在你的 web 工程下,有一個 admin 目錄。這個 admin 目錄下的所有資源(html 頁面、jpg 圖片、jsp 文件、等等)都必
須是用戶登錄之後才允許訪問。
思考:根據之前我們學過內容。我們知道,用戶登錄之後都會把用戶登錄的信息保存到 Session 域中。所以要檢查用戶是否
登錄,可以判斷 Session 中否包含有用戶登錄的信息即可!!!

<%
Object user = session.getAttribute("user");
// 如果等於 null ,說明還沒有登錄
if (user == null) {
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
%>

Fiter工作流程

package com.wkl.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * Description:
 * Date:       2020/6/15 - 上午 12:01
 * author:     wangkanglu
 * version:    V1.0
 */
public class loginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");
// 如果等於 null ,說明還沒有登錄
        if (user == null) {
            servletRequest.getRequestDispatcher("/hello").forward(servletRequest, servletResponse);
            return;
        } else {
// 讓程序繼續往下訪問用戶的目標資源
            filterChain.doFilter(servletRequest, servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}
    <filter>
        <!-- 給 filter 起一個別名 -->
        <filter-name>AdminFilter</filter-name>
        <!-- 配置 filter 的全類名 -->
        <filter-class>com.wkl.filter.loginFilter</filter-class>
    </filter>
    <!--filter-mapping 配置 Filter 過濾器的攔截路徑 -->
    <filter-mapping>
        <!--filter-name 表示當前的攔截路徑給哪個 filter 使用 -->
        <filter-name>AdminFilter</filter-name>
        <!--url-pattern 配置攔截路徑
        / 表示請求地址爲: http://ip:port/ 工程路徑 / 映射到 IDEA 的 web 目錄
        /admin/* 表示請求地址爲: http://ip:port/ 工程路徑 /admin/*
        -->
        <url-pattern>/**</url-pattern>
    </filter-mapping>

3:Filter 生命週期

Filter 的生命週期包含幾個方法
1、構造器方法
2、init 初始化方法
第 1,2 步,在 web 工程啓動的時候執行(Filter 已經創建)
3、doFilter 過濾方法
第 3 步,每次攔截到請求,就會執行
4、destroy 銷燬
第 4 步,停止 web 工程的時候,就會執行(停止 web 工程,也會銷燬 Filter 過濾器)

4:FilterConfig 類

FilterConfig 類見名知義,它是 Filter 過濾器的配置文件類。
Tomcat 每次創建 Filter 的時候,也會同時創建一個 FilterConfig 類,這裏包含了 Filter 配置文件的配置信息。
FilterConfig 類的作用是獲取 filter 過濾器的配置內容
1、獲取 Filter 的名稱 filter-name 的內容
2、獲取在 Filter 中配置的 init-param 初始化參數
3、獲取 ServletContext 對象

@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("2.Filter 的 的 init(FilterConfig filterConfig) 初始化");
// 1 、獲取 Filter 的名稱 filter-name 的內容
System.out.println("filter-name  的值是:" + filterConfig.getFilterName());
// 2 、獲取在 web.xml 中配置的 init-param 初始化參數
System.out.println(" 初始化參數 username  的值是 :" + filterConfig.getInitParameter("username"));
System.out.println(" 初始化參數 url  的值是:" + filterConfig.getInitParameter("url"));
// 3 、獲取 ServletContext 對象
System.out.println(filterConfig.getServletContext());
}

5:FilterChain 過濾鏈

Filter 過濾器
Chain 鏈,鏈條
FilterChain 就是過濾器鏈(多個過濾器如何一起工作)

6:Filter攔截路徑

--精確匹配 精確匹配
<url-pattern>/target.jsp</url-pattern>
以上配置的路徑,表示請求地址必須爲:http://ip:port/工程路徑/target.jsp
--目錄匹配 目錄匹配
<url-pattern>/admin/*</url-pattern>
以上配置的路徑,表示請求地址必須爲:http://ip:port/工程路徑/admin/*
--後綴名匹配 後綴名匹配
<url-pattern>*.html</url-pattern>
以上配置的路徑,表示請求地址必須以.html 結尾纔會攔截到
<url-pattern>*.do</url-pattern>
以上配置的路徑,表示請求地址必須以.do 結尾纔會攔截到
<url-pattern>*.action</url-pattern>
以上配置的路徑,表示請求地址必須以.action 結尾纔會攔截到
Filter 過濾器它只關心請求的地址是否匹配,不關心請求的資源是否存在!!! 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章