Table of Contents
2.1:ServletContextListener 監聽器,一定要在 web.xml 文件中配置之後纔會生效
2:如何創建 Session 和獲取(id 號, 是否爲新)
2.2:isNew(); 判斷到底是不是剛創建出來的(新的)
2.3:getId() 得到 Session 的會話 id 值。
4.1Session 默認的超時時長是多少!Session 默認的超時時間長爲 30 分鐘。
監聽器和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 過濾器它只關心請求的地址是否匹配,不關心請求的資源是否存在!!!