1. 程式人生 > >Java基礎——Servlet(七)過濾器&監聽器 相關

Java基礎——Servlet(七)過濾器&監聽器 相關

計數器 cti inf width 正在 tab implement eve login

一、過濾器簡介

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(七)過濾器&監聽器 相關