摘要:創建與銷毀對象是發送請求服務器就會創建它,當響應產生時,對象就會銷毀。是容器為開發人員提供的對象,它提供了對某一資源的已過濾請求調用鏈的視圖。
一、Listener監聽器
Javaweb開發中的監聽器,是用于監聽web常見對象 HttpServletRequest HttpSession ServletContext 監聽它們的創建與銷毀 屬性變化 session綁定javaBean
1、監聽機制
事件 就是一個事情 事件源 產生這個事情的源頭 監聽器 用于監聽指定的事件的對象 注冊監聽 要想讓監聽器可以監聽到事件產生,必須對其進行注冊。 ------------------------------
2、Javaweb開發中常見監聽器
2.1、監聽域對象的創建與銷毀
監聽ServletContext創建與銷毀 ServletContextListener
監聽HttpSession創建與銷毀 HttpSessionListener
監聽HttpServletRequest創建與銷毀 ServletRequestListener
2.2、監聽域對象的屬性變化
監聽ServletContext屬性變化 ServletContextAttributeListener
監聽HttpSession屬性變化 HttpSessionAttributeListener
監聽HttpServletRequest屬性變化 ServletRequestAttributeListener
2.3、監聽session綁定javaBean
它是用于監聽javaBean對象是否綁定到了session域 HttpSessionBindingListener
它是用于監聽javaBean對象的活化與鈍化 HttpSessionActivationListener
3、監聽器的快速入門
關于創建一個監聽器的步驟
1.創建一個類,實現指定的監聽器接口
2.重寫接口中的方法
3.在web.xml文件中對監聽器進行注冊。
3.1、關于域對象創建與銷毀的演示
1.ServletContext對象的創建與銷毀
這個對象是在服務器啟動時創建的,在服務器關閉時銷毀的。
2.HttpSession對象的創建與銷毀
HttpSession session=request.getSession();
Session銷毀
1.默認超時 30分鐘
2.關閉服務器
3.invalidate()方法
4.setMaxInactiveInterval(int interval) 可以設置超時時間
問題:直接訪問一個jsp頁面時,是否會創建session?
會創建,因為我們默認情況下是可以在jsp頁面中直接使用session內置對象的。
3.HttpServletRequest創建與銷毀
Request對象是發送請求服務器就會創建它,當響應產生時,request對象就會銷毀。
3.2、演示了Request域對象中屬性變化
在java的監聽機制中,它的監聽器中的方法都是有參數的,參數就是事件對象,而我們可以通過事件對象直接獲取事件源。
3.3、演示session綁定javaBean
1.javaBean對象自動感知被綁定到session中.
HttpSessionBindingListener 這個接口是由javaBean實現的,并且不需要在web.xml文件中注冊.
2.javabean對象可以活化或鈍化到session中。
HttpSessionActivationListener如果javaBean實現了這個接口,那么當我們正常關閉服務器時,session中的javaBean對象就會被鈍化到我們指定的文件中。
當下一次在啟動服務器,因為我們已經將對象寫入到文件中,這時就會自動將javaBean對象活化到session中。
我們還需要個context.xml文件來配置鈍化時存儲的文件
在meta-inf目錄下創建一個context.xml文件
案例-定時銷毀session
1.怎樣可以將每一個創建的session全都保存起來?
我們可以做一個HttpSessionListener,當session對象創建時,就將這個session對象裝入到一個集合中.
將集合List
2.怎樣可以判斷session過期了?
在HttpSession中有一個方法public long getLastAccessedTime()
它可以得到session對象最后使用的時間。
可以使用invalidate方法銷毀。
我們上面的操作需要使用任務調度功能. 在java中有一個Timer定時器類
關于三個域對象獲取
如果在Servlet中要獲取 request,在方法上就有,request.getSession() getServletContext();
如果我們有request對象了, request.getSession() request.getSession().getServletCotnext();
程序在使用時,需要考慮并發問題,因為我們在web中,它一定是一個多線程的,那么我們的程序對集合進行了添加,還有移除操作。
二、Filter過濾器(重要)
Javaweb中的過濾器可以攔截所有訪問web資源的請求或響應操作。
1、Filter快速入門
1.1、步驟:
1.創建一個類實現Filter接口
2.重寫接口中方法 doFilter方法是真正過濾的。
3.在web.xml文件中配置
注意:在Filter的doFilter方法內如果沒有執行chain.doFilter(request,response)
那么資源是不會被訪問到的。
1.2、FilterChain
FilterChain 是 servlet 容器為開發人員提供的對象,它提供了對某一資源的已過濾請求調用鏈的視圖。過濾器使用 FilterChain 調用鏈中的下一個過濾器,如果調用的過濾器是鏈中的最后一個過濾器,則調用鏈末尾的資源。
問題:怎樣可以形成一個Filter鏈?
只要多個Filter對同一個資源進行攔截就可以形成Filter鏈
問題:怎樣確定Filter的執行順序?
由來確定 1.3、Filter生命周期
Servlet生命周期:
實例化 --》 初始化 --》 服務 --》 銷毀
?當服務器啟動,會創建Filter對象,并調用init方法,只調用一次.
?當訪問資源時,路徑與Filter的攔截路徑匹配,會執行Filter中的doFilter方法,這個方法是真正攔截操作的方法.
?當服務器關閉時,會調用Filter的destroy方法來進行銷毀操作.
1.4、FilterConfig 在Filter的init方法上有一個參數,類型就是FilterConfig. FilterConfig它是Filter的配置對象,它可以完成下列功能
1.獲取Filtr名稱
2.獲取Filter初始化參數
3.獲取ServletContext對象。
問題:怎樣在Filter中獲取一個FIlterConfig對象?
1.5、Filter配置
基本配置filter名稱 Filter類的包名.類名 關于其它配置 1. filter名稱 路徑 完全匹配 以”/demo1”開始,不包含通配符* 目錄匹配 以”/”開始 以*結束 擴展名匹配 *.xxx 不能寫成/*.xxx 2. 它是對指定的servlet名稱的servlet進行攔截的。 3. 可以取的值有 REQUEST FORWARD ERROR INCLUDE
它的作用是:當以什么方式去訪問web資源時,進行攔截操作.
1.REQUEST 當是從瀏覽器直接訪問資源,或是重定向到某個資源時進行攔截方式配置的 它也是默認值
2.FORWARD 它描述的是請求轉發的攔截方式配置
3.ERROR 如果目標資源是通過聲明式異常處理機制調用時,那么該過濾器將被調用。除此之外,過濾器不會被調用。
4.INCLUDE 如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用。除此之外,該過濾器不會被調用
三、自動登陸
1、創建庫與表 CREATE DATABASE day17
USE day17
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100), PASSWORD VARCHAR(100)
)
INSERT INTO USER VALUES(NULL,"tom","123");
2、自動登陸功能實現:
1.當用戶登陸成功后,判斷是否勾選了自動登陸,如果勾選了,就將用戶名與密碼持久化存儲到cookie中
2.做一個Filter,對需要自動登陸的資源進行攔截
問題
1.如果用戶想要登陸操作,還需要自動登陸嗎?
2.如果用戶已經登陸了,還需要自動登陸嗎?
四、MD5加密
在mysql中可以對數據進行md5加密 Md5(字段) UPDATE USER SET PASSWORD=MD5(PASSWORD); 在java中也提供了md5加密 /**
使用md5的算法進行加密
*/
public static String md5(String plainText) {
byte[] secretBytes = null; try { secretBytes = MessageDigest.getInstance("md5").digest( plainText.getBytes()); } catch (NoSuchAlgorithmException e) { throw new RuntimeException("沒有md5這個算法!"); } String md5code = new BigInteger(1, secretBytes).toString(16); for (int i = 0; i < 32 - md5code.length(); i++) { md5code = "0" + md5code; } return md5code;
五、全局的編碼過濾器
分析: 我們之前做的操作,只能對post請求是ok
怎樣可以做成一個通用的,可以處理post,get所有的請求的?
在java中怎樣可以對一個方法進行功能增強?
1.繼承
2.裝飾設計模式
1.創建一個類讓它與被裝飾類實現同一個接口或繼承同一個父類
2.在裝飾類中持有一個被裝飾類的引用
3.重寫要增強的方法
問題:我們獲取請求參數有以下方法
1.getParameter
2.getPrameterValues
3.getParameterMap
這三個方法都可以獲取請求參數。
分析后,我們知道getParameter與getParameterValue方法可以依賴于getParamterMap方法來實現。
// 這個就是我們對request進行裝飾的類
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;// 是用于接收外部傳遞的原始的request
public MyRequest(HttpServletRequest request) {
super(request); // 是因為父類沒有無參數構造 this.request = request;
}
// @Override
// public String getParameter(String name) {
// // 1.得到原來的getParameter方法的值
// String value = request.getParameter(name); // 亂碼
//
// try {
// return new String(value.getBytes("iso8859-1"), "utf-8");
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
// return null;
// }
@Override
public String getParameter(String name) {
if (name != null) { String[] st = (String[]) getParameterMap().get(name); if (st != null && st.length > 0) { return st[0]; } } return null;
}
@Override
public String[] getParameterValues(String name) {
if (name != null) { return (String[]) getParameterMap().get(name); } return null;
}
private boolean flag = true;
@Override
public Map getParameterMap() {
// 1.得到原始的map集合 Mapmap = request.getParameterMap();// 亂碼 if (flag) { // 2.將map集合中的String[]得到,解決每一個元素的亂碼問題. for (String key : map.keySet()) { String[] st = map.get(key); // 得到每一個數組 for (int i = 0; i < st.length; i++) { try { st[i] = new String(st[i].getBytes("iso8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } flag = false; } return map;
}
}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72481.html
摘要:方法對象銷毀時執行方法其中的參數每次在執行方法時容器負責創建一個和一個對象作為的參數傳遞進來。該個該就是在訪問目標資源的方法時的和。 一、過濾器Filter1.filter的簡介filter是對客戶端訪問資源的過濾,符合條件放行,不符合條件不放行,并且可以對目 標資源訪問前后進行邏輯處理2.快速入門步驟:1)編寫一個過濾器的類實現Filter接口2)實現接口中尚未實現的方法(著重...
摘要:準備好了我們可以開始向中發布,當發布后,所有在中的都會收到對應的。將類注入到的中。測試和通過方法將發布到應用上下文中,同時這個動作會觸發收到事件。深入剖析發布與監聽的過程在使用方法發布的時候,最終會調用到中的類的如下的一段代碼。 本篇主要來聊一聊spring中ApplicationListener接口和ApplicationEvent類。 從命名上可以很容易的看出來一個是listene...
摘要:實體代碼如下所示恒宇少年碼云用戶名密碼創建內添加一個注冊方法,該方法只是實現注冊事件發布功能,代碼如下所示恒宇少年碼云用戶注冊方法省略其他邏輯發布事件事件發布是由對象管控的,我們發布事件前需要注入對象調用方法完成事件發布。 ApplicationEvent以及Listener是Spring為我們提供的一個事件監聽、訂閱的實現,內部實現原理是觀察者設計模式,設計初衷也是為了系統業務邏輯之...
摘要:學習筆記工作以來就一直在用各種框架,比如,這些,向外提供接口都很方便,但是一直在想它的內部是怎樣對外暴露服務的,正好之前學習基礎的時候也沒好好看這塊,抽個時間學習總結一下,也能更好的理解掌握現在的框架。 Servlet學習筆記 工作以來就一直在用各種web框架,比如SpringMVC,Spring Cloud這些,向外提供接口都很方便,但是一直在想它的內部是怎樣對外暴露服務的,正好之前...
閱讀 3258·2021-11-15 11:37
閱讀 1065·2021-11-02 14:45
閱讀 3893·2021-09-04 16:48
閱讀 3569·2019-08-30 15:55
閱讀 748·2019-08-23 17:53
閱讀 994·2019-08-23 17:03
閱讀 2020·2019-08-23 16:43
閱讀 2182·2019-08-23 16:22