攔截器,監聽器,過濾器——java面試必問系列

  • */
  • public
    class UserLoginInterceptorBySpring extends HandlerInterceptorAdapter{
  • // 在業務處理器處理請求之前被調用
  • public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
  • // equalsIgnoreCase 與 equals的區別?
  • if("GET".equalsIgnoreCase(request.getMethod())){
  • //RequestUtil.saveRequest();
  • }
  • System.out.println("preHandle...");
  • String requestUri = request.getRequestURI();
  • String contextPath = request.getContextPath();
  • String url = requestUri.substring(contextPath.length());
  • System.out.println("requestUri" + requestUri);
  • System.out.println("contextPath" + contextPath);
  • System.out.println("url" + url);
  • String username = (String) request.getSession().getAttribute("username");
  • if(null == username){
  • // 跳轉到登錄頁面
  • request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
  • return false;
  • }
  • else{
  • return true;
  • }
  • }
  • // 在業務處理器處理請求完成之後,生成視圖之前執行
  • public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{
  • System.out.println("postHandle...");
  • if(modelAndView != null){
  • Map map = new
    HashMap();
  • modelAndView.addAllObjects(map);
  • }
  • }
  • // 在DispatcherServlet完全處理完請求之後被調用,可用於清理資源
  • public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception{
  • System.out.println("afterCompletion...");
  • }
  • }
  • 攔截器是依賴Java反射機制來實現的。攔截器的實現,用到的是JDK實現的動態代理,我們都知道,JDK實現的動態代理,需要依賴接口。攔截器

    是在面向切面編程中應用的,就是在你的service或者一個方法前調用一個方法,或者在方法後調用一個方法。攔截器不是在web.xml,比如struts在

    struts.xml中配置。[java] view plain copy print?

    1. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    2. Object result = null;
    3. System.out.println("方法調用前,可以執行一段代碼" + method.getName());
    4. result = method.invoke(this.targetObj, args);
    5. System.out.println("方法調用後,可以執行一段代碼 " + method.getName());
    6. return result;
    7. }

    總結:

    1.過濾器(Filter):所謂過濾器顧名思義是用來過濾的,Java的過濾器能夠為我們提供系統級別的過濾,也就是說,能過濾所有的web請求,

    這一點,是攔截器無法做到的。在Java Web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或

    者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者struts

    的action前統一設置字符集,或者去除掉一些非法字符(聊天室經常用到的,一些罵人的話)。filter 流程是線性的,url傳來之後,檢查之後,

    可保持原來的流程繼續向下執行,被下一個filter, servlet接收。

    2.監聽器(Listener):Java的監聽器,也是系統級別的監聽。監聽器隨web應用的啟動而啟動。Java的監聽器在c/s模式裡面經常用到,它

    會對特定的事件產生產生一個處理。監聽在很多模式下用到,比如說觀察者模式,就是一個使用監聽器來實現的,在比如統計網站的在線人數。

    又比如struts2可以用監聽來啟動。Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理。

    3.攔截器(Interceptor):java裡的攔截器提供的是非系統級別的攔截,也就是說,就覆蓋面來說,攔截器不如過濾器強大,但是更有針對性。

    Java中的攔截器是基於Java反射機制實現的,更準確的劃分,應該是基於JDK實現的動態代理。它依賴於具體的接口,在運行期間動態生成字節碼。

    攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發者在一個Action執行的前後執行一段代碼,也可以在一個Action執行前阻止其

    執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用於在某個方法或者字段被訪問之前,進行攔截然後再之前或

    者之後加入某些操作。java的攔截器主要是用在插件上,擴展件上比如 Hibernate Spring Struts2等,有點類似面向切片的技術,在用之前先要在

    配置文件即xml,文件裡聲明一段的那個東西。


    分享到:


    相關文章: