日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java Web - 服务器中的过滤器和监听器

發布時間:2025/4/16 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Web - 服务器中的过滤器和监听器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 過濾器

每個servlet都有自己需要處理的資源,這么多的資源我們有時候我們希望統一的進行管理,比如對響應的圖片進行加水印處理,對提交和響應的數據的編碼進行統一,或者是對提交的數據進行過濾。

解決的辦法就是使用過濾器,他的目的是對服務器和瀏覽器之間交互的資源進行管理和保護servlet安全(一定程度上)。他的角色就像是服務器與瀏覽器之間的橋梁。它是由服務器調用執行的。

1.1 使用過濾器

1. 實現Filter接口
2. 覆寫接口方法

public class MyFilter implements Filter {//啟動即執行,進行資源初始化@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("MyFilterinit!!");}//請求發送執行,進行資源管理@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilteredoFilterExit!!");//放行,這里如果不放行,請求就不會被servlet處理filterChain.doFilter(servletRequest, servletResponse);System.out.println("MyFilterdoFilterReturn!!");}//服務器關閉執行,對資源進行關閉@Overridepublic void destroy() {System.out.println("MyFilterdestroy!!");} }

3. 在web.xml中配置過濾器

<filter><filter-name>myFilter</filter-name><filter-class>com.chester.web.servlet.MyFilter</filter-class> </filter> <filter-mapping><filter-name>myFilter</filter-name><!--/*代表對所有項目根目錄的請求都過濾--><url-pattern>/*</url-pattern> </filter-mapping>

這里的 <url-pattern>有很靈活的寫法,根據項目需求來寫即可,這里再給出幾個例子

<!--攔截所有以.do結尾的請求,一般進行的是模塊攔截--> <url-pattern>*.do</url-pattern> <!--攔截指定url請求,針對某個servlet的請求進行攔截,保護servlet--> <url-pattern>/ts</url-pattern>

在執行一個過濾器之后,如果還有符合要求的過濾器,則再執行符合要求的過濾器,執行完doFilter方法中filterChain.doFilter()方法后,繼續執行doFilter中接下來的代碼。

1.2 案例

下面我們來看看幾個具體的使用場景,我們只關注關鍵代碼部分。代碼設置了接收和發送的編碼格式,以及實現對session的管理,如果session失效,則要求用戶重新登陸。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//編碼格式設置servletRequest.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=utf-8");//session管理,HttpSession hs = ((HttpServletRequest)servletRequest).getSession();if(hs.getAttribute("user") == null){((HttpServletResponse)servletResponse).sendRedirect("/JavaWebTest/login.jsp");}else{//放行filterChain.doFilter(servletRequest, servletResponse);} }

二 監聽器

上面我們使用了過濾器對資源進行統一的管理,但是有的時候,我們需要知道數據流轉的具體過程,比如作用域對象是什么時候創建和銷毀的,作用域對象中的數據是什么時候存取,改變和刪除的。以此來進行一些處理,比如如果統計網站的在線人數,我們就需要知道session是什么時候銷毀和創建的。創建在線人數+1,銷毀則-1。通過監聽器就可以完成這樣的功能。

2.1 使用監聽器

監聽器可以監聽request、session、application的創建銷毀和內容的改變,下面

2.1.1 監聽request對象

創建ServletRequestListener的實現類

public class MyListener implements ServletRequestListener, ServletRequestAttributeListener{//監聽作用域創建于銷毀 繼承 ServletRequestListener//作用域銷毀時調用public void requestDestroyed(ServletRequestEvent sre) {sre.getServletRequest();System.out.println("MyListenerDestroyed");}//作用域創建時調用public void requestInitialized(ServletRequestEvent sre) {System.out.println("MyListenerInitialized");}//監聽作用域數據修改 繼承 ServletRequestAttributeListener//數據增加時調用public void attributeAdded(ServletRequestAttributeEvent srae) {System.out.println("request 中增加了-" + srae.getName() + ":" +srae.getValue());}//數據刪除時調用public void attributeRemoved(ServletRequestAttributeEvent srae) {System.out.println("request 中刪除了-" + srae.getName() + ":" +srae.getValue());}//數據修改時調用public void attributeReplaced(ServletRequestAttributeEvent srae) {System.out.println("request 中改變了-" + srae.getName() + ":" +srae.getValue());} }

在web.xml中配置監聽器

<!--配置監聽器--> <listener><listener-class>com.chester.web.servlet.MyListener</listener-class> </listener>
2.1.2 監聽session對象

和request一樣,繼承HttpSessionListener,HttpSessionAttributeListener

2.1.3 監聽application對象

一樣,繼承ServletContextListener, ServletContextAttributeListener

2.2 監聽器使用案例

該案例在application對象中使用count這個鍵維護網站的登陸人數,你可以在適當的地方進行取用。

public class MyListener implements HttpSessionListener, ServletContextListener{//當一個session建立的時候,說明有用戶進行了登陸count++public void sessionCreated(HttpSessionEvent se) {ServletContext sc = se.getSession().getServletContext();int count = (int)sc.getAttribute("count");sc.setAttribute("count", ++count);}//當一個session銷毀的時候,說明有用戶進行了退出count--public void sessionDestroyed(HttpSessionEvent se) {ServletContext sc = se.getSession().getServletContext();int count = (int)sc.getAttribute("count");sc.setAttribute("count", --count);}//application對象建立時,初始化count為0public void contextInitialized(ServletContextEvent sce) {//獲取applicationServletContext sc = sce.getServletContext();sc.setAttribute("count", 0);} }

總結

以上是生活随笔為你收集整理的Java Web - 服务器中的过滤器和监听器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。