Java基礎——Servlet(七)過濾器&監聽器 相關
一、過濾器簡介
Filter 位於客戶端和請求資源之間,請求的資源可以是 Servlet Jsp html (img,javascript,css)等。用於攔截瀏覽器發給服務器的請求(Request)和服務器返回給瀏覽器的內容(Response)。一言以蔽之:過濾器是用來篩選請求的。
* 怎麽實現一個過濾器? 思路如下:
1) 編寫一個類, 實現javax.servlet.Filter 接口
-- destory();
-- init(FilterConfig config);
-- doFilter(ServletRequest req,ServletResponse resp, FilterChain chain);
2) 在 web.xml 中進行配置
二、處理亂碼的過濾器
public class CharaFilter implements Filter{ private String encoding="iso8859-1"; //默認 public void destroy() {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("----過濾器起作用了----"); request.setCharacterEncoding(encoding); //response.setCharacterEncoding(encoding); chain.doFilter(request, response); } @Override public void init(FilterConfig config) throws ServletException { String confEncoding=config.getInitParameter("encoding"); //取得Filter配置文件中的初始化參數 if(confEncoding!=null){ encoding=confEncoding; } } }
//配置文件設置 <filter> <filter-name>CharaFilter</filter-name> <filter-class>filter.CharaFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharaFilter</filter-name> <url-pattern>/*</url-pattern> //這裏面/*中的杠需要轉義,這裏我沒有用 </filter-mapping>
三、驗證是否有Session 的過濾器
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse rep=(HttpServletResponse)response; if(req.getSession().getAttribute("userInfo")==null){ req.getRequestDispatcher("/login.jsp").forward(request, response); /* //這裏的 / 代表當前web應用的根路徑 /Lession49 req.getRequestDispatcher("/xxxx").forward(request, response); //這裏代表當前web服務器的根路徑 ... 8080/ rep.sendRedirect("/xxxx"); //如果想讓sendRedirect準確 rep.sendRedirect(req.getContextPath()+"/"+"xxxx"); //這裏的getContextPath取得的是 web應的根路徑 /Lession49 */ }else{ chain.doFilter(request, response); } } //配置文件的設置 <filter> <filter-name>sessionFilter</filter-name> <filter-class>filter.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>/Admin杠*</url-pattern> </filter-mapping>
四、servlet監聽器
servlet監聽的對象:
它負責監聽ServletContext、HttpSession、ServletRequest對象的生命周期時間,以及屬性改變事件。用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理
Listener是Servlet的監聽器,它可以監聽客戶端的請求、服務端的操作等。通過監聽器,可以自動激發一些操作,比如監聽在線的用戶的數量。當增加一個HttpSession時,就激發sessionCreated(HttpSessionEvent se)方法,目前Servlet2.4和JSP2.0總共有8個監聽器接口和6個Event類。
Listener接口 | Event類 |
ServletContextListener | ServletContextEvent |
ServletContextAttributeListener | ServletContextAttributeEvent |
HttpSessionListener | HttpSessionEvent |
HttpSessionActivationListener | 同上 |
HttpSessionAttributeListener | HttpSessionBindingEvent //用於監聽session中何時添加、刪除或替換了某種類型的屬性 |
HttpSessionBindingListener | 同上 //由屬性自身來實現,以便屬性知道它什麽時候被添加到一個session中,或者什麽時候從session中刪除。 |
ServletRequestListener | ServletRequestEvent |
4.1 ServletContextListener
用於監聽W EB 應用啟動和銷毀的事件,監聽器類需要實現javax.servlet.ServletContextListener 接口。
ServletContextListener 是 ServletContext 的監聽者,如果 ServletContext 發生變化,如服務器啟動時 ServletContext 被創建,服務器關閉時 ServletContext 將要被銷毀。
--ServletContextListener接口的方法:
void contextInitialized(ServletContextEvent sce) //通知正在接受的對象,應用程序已經被加載及初始化。 void contextDestroyed(ServletContextEvent sce) // 通知正在接受的對象,應用程序已經被載出。
--ServletContextEvent中的方法:
ServletContext getServletContext() // 取得ServletContext對象 (application)
4.2 ServletContextAttributeListener
用於監聽WEB應用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監聽器類需要實現javax.servlet.ServletContextAttributeListener接口。
--ServletContextAttributeListener接口方法:
void attributeAdded(ServletContextAttributeEvent scab)//若有對象加入Application的範圍,通知正在收聽的對象 void attributeRemoved(ServletContextAttributeEvent scab) // 若有對象從Application的範圍移除,通知正在收聽的對象 void attributeReplaced(ServletContextAttributeEvent scab)//若在Application的範圍中,有對象取代另一個對象時,通知正在收聽的對象
--ServletContextAttributeEvent中的方法:
java.lang.String getName() 回傳屬性的名稱
java.lang.Object getValue() 回傳屬性的值
4.3 HttpSessionListener
HttpSessionListener 監聽HttpSession的操作。當創建一個Session時,激發session Created(HttpSessionEvent se)方法;當銷毀一個Session時,激發sessionDestroyed (HttpSessionEvent se)方法。
4.4 HttpSessionActivationListener
主要用於同一個Session轉移至不同的JVM的情形,用於監聽Http會話active、passivate情況。。
HttpSessionAttributeListener
4.5 HttpSessionAttributeListener監聽HttpSession中的屬性的操作。
當在 Session 增加一個屬性時,激發attributeAdded(HttpSessionBindingEvent se) 方法;
當在Session刪除一個屬性時,激發attributeRemoved(HttpSessionBindingEvent se)方法;
當在Session屬性被重新設置時,激發attributeReplaced(HttpSessionBindingEvent se) 方法。
這和ServletContextAttributeListener比較類似
4.6 HttpSessionBindingListener
註意:HttpSessionBindingListener接口是唯一不需要再web.xml中設定的Listener
當我們的類實現了HttpSessionBindingListener接口後,只要對象加入Session範圍
(即調用HttpSession對象的 setAttribute方法的時候)或從Session範圍中移出
(即調用HttpSession對象的removeAttribute方法的時候或 Session Time out的時候)時,容器分別會自動調用下列兩個方法:
-- void valueBound(HttpSessionBindingEvent event)
-- void valueUnbound(HttpSessionBindingEvent event)
4.7 ServletRequestListener
它和ServletContextListener接口類似的,這裏由ServletContext改為ServletRequest。
4.8 ServletRequestAttributeListener
它和ServletContextListener接口類似的,這裏由ServletContext改為ServletRequest。
五、servlet監聽器實例
//例一 1) 創建一個類,實現某個監聽器接口 public class MyListener implements ServletContextListener{ public void contextDestroyed(ServletContextEvent arg0) { System.out.println("上下文銷毀了"); //網站關閉 } public void contextInitialized(ServletContextEvent arg0) { System.out.println("上下文創建了"); //網站啟動的時候 } } 2) 在web.xml 這個配置文件中進行配置 <listener> <listener-class>cat.listener.MyListener</listener-class> </listener>
//例二 通過實現 MySessionListener 接口, 做一個簡單在線人數計數器 public class MyListener implements ServletContextListener{ public void contextDestroyed(ServletContextEvent arg0) { System.out.println("上下文銷毀了"); //網站關閉 } public void contextInitialized(ServletContextEvent arg0) { System.out.println("上下文創建了"); //網站啟動的時候 } } //配置文件的設置 <listener> <listener-class>cat.listener.MySessionListener</listener-class> </listener> //index.jsp設置 <% out.println("當前在線人數:"+ MySessionListener.getSessioCount()); %>
Java基礎——Servlet(七)過濾器&監聽器 相關