Java Web - 服务器中的过滤器和监听器
一 過濾器
每個servlet都有自己需要處理的資源,這么多的資源我們有時候我們希望統一的進行管理,比如對響應的圖片進行加水印處理,對提交和響應的數據的編碼進行統一,或者是對提交的數據進行過濾。
解決的辦法就是使用過濾器,他的目的是對服務器和瀏覽器之間交互的資源進行管理和保護servlet安全(一定程度上)。他的角色就像是服務器與瀏覽器之間的橋梁。它是由服務器調用執行的。
1.1 使用過濾器
1. 實現Filter接口
2. 覆寫接口方法
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 - 服务器中的过滤器和监听器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Web - Ajax技术
- 下一篇: Spring - IOC常用标签