JavaEE基礎(05):過濾器、監聽器、攔截器,應用詳解

本文源碼: GitHub·點這裏 || GitEE·點這裏

1、Listener監聽器

一、概念簡介

JavaWeb三大組件:Servlet,Listener,Filter。監聽器就是指在應用程序中監聽相關對象狀態變化的組件。html

二、事件源對象

指被監聽對象。java

  • ServletContext

ServletContextListener生命週期監聽,它有兩個方法,出生時調用contextInitialized(),銷燬時調用contextDestroyed();node

ServletContextAttributeListener屬性監聽,它有三個方法,添加屬性attributeAdded(),替換屬性attributeReplaced(),移除屬性時attributeRemoved()git

  • HttpSession

HttpSessionListener生命週期監聽:它有兩個方法,出生時調用sessionCreated(),銷燬時調用sessionDestroyed()github

HttpSessioniAttributeListener屬性監聽:它有三個方法,添加屬性attributeAdded(),替換屬性attributeReplaced(),移除屬性attributeRemoved()web

  • ServletRequest

ServletRequestListener生命週期監聽:它有兩個方法,出生時調用requestInitialized(),銷燬時調用requestDestroyed()segmentfault

ServletRequestAttributeListener屬性監聽:它有三個方法,添加屬性attributeAdded(),替換屬性attributeReplaced(),移除屬性attributeRemoved()服務器

三、編碼案例

  • 相關監聽器

TheContextListenersession

public class TheContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("初始化:TheContextListener");
        ServletContext servletContext = servletContextEvent.getServletContext() ;
        servletContext.setAttribute("author","cicada");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("銷燬:TheContextListener");
    }
}

TheRequestListenerapp

public class TheRequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("初始化:TheRequestListener");
    }
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("銷燬:TheRequestListener");
    }
}

TheSessionListener

public class TheSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("初始化:TheSessionListener");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("銷燬:TheSessionListener");
    }
}

RequestAttributeListener

public class RequestAttributeListener implements ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent evt) {
        System.out.println("Request添加屬性:"+evt.getName()+";"+evt.getValue());
    }
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent evt) {
        System.out.println("Request移除屬性:"+evt.getName()+";"+evt.getValue());
    }
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent evt) {
        System.out.println("Request替換屬性:"+evt.getName()+";"+evt.getValue());
    }
}
  • web.xml配置文件
<!-- 監聽器相關配置 -->
<listener>
    <listener-class>com.node05.servlet.listener.TheContextListener</listener-class>
</listener>
<listener>
    <listener-class>com.node05.servlet.listener.TheSessionListener</listener-class>
</listener>
<listener>
    <listener-class>com.node05.servlet.listener.TheRequestListener</listener-class>
</listener>
<listener>
    <listener-class>com.node05.servlet.listener.RequestAttributeListener</listener-class>
</listener>
<session-config>
    <!-- 設置session失效時間爲1分鐘 -->
    <session-timeout>1</session-timeout>
</session-config>
  • 測試接口
public class ListenerServletImpl extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 一、獲取TheContextListener初始化數據
        ServletContext servletContext = this.getServletContext() ;
        String author = String.valueOf(servletContext.getAttribute("author")) ;
        System.out.println("TheContextListener Author:"+author);
        // 二、Request屬性設置
        request.setAttribute("mood","smile");
        request.setAttribute("mood","agitated");
        // 三、Session建立,1分鐘失效,調用銷燬
        HttpSession session = request.getSession(true) ;
        session.setAttribute("casually","casually");
        response.getWriter().print("Hello:Listener");
    }
}

2、Filter過濾器

一、過濾器簡介

客戶端請求Servlet時,先執行相關Filter,若是Filter經過,則繼承執行請求的Servlet;若是Filter不經過,則不會執行用戶請求的Servlet。過濾器能夠動態地攔截請求和響應。

二、Filter接口

Filter接口定義了三個核心方法。

  • init()

應用程序啓動時,服務器實例化Filter對象,並調用其init方法,讀取web.xml配置,完成對象的初始化加載。

  • doFilter()

實際的過濾操做,請求達到服務器時,Servlet容器將先調用過濾器的doFilter方法。

  • destroy()

容器在銷燬過濾器前調用該方法,釋放過濾器佔用的資源。

三、編碼案例

  • 編寫過濾器
public class ThePrintLogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String myName = filterConfig.getInitParameter("myName") ;
        System.out.println("myName:"+myName);
    }
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest ;
        HttpServletResponse response = (HttpServletResponse)servletResponse ;
        String name = request.getParameter("name") ;
        if (!name.equals("cicada")){
            response.getWriter().print("User Error !");
            return ;
        }
        chain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
        System.out.println("ThePrintLogFilter destroy()");
    }
}
  • web.xml配置文件
<!-- 過濾器相關配置 -->
<filter>
    <filter-name>thePrintLogFilter</filter-name>
    <filter-class>com.node05.servlet.filter.ThePrintLogFilter</filter-class>
    <init-param>
        <param-name>myName</param-name>
        <param-value>cicada</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>thePrintLogFilter</filter-name>
    <url-pattern>/filterServletImpl</url-pattern>
</filter-mapping>
  • 測試接口
public class FilterServletImpl extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("Hello:Filter");
    }
}

3、Interceptor攔截器

Spring框架中的攔截器Interceptor相似於Servlet中的過濾器Filter,主要用於攔截用戶請求並做相應的處理。例如經過攔截器能夠進行權限驗證、記錄請求信息的日誌、判斷用戶是否登陸等。請求轉發不執行攔截、過濾;重定向執行攔截和過濾。

4、源代碼地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

相關文章
相關標籤/搜索