過濾器, 攔截器,監聽器

下面介紹過濾器和攔截器以及監聽器的使用方法:
執行順序 :監聽器 > 過濾器 > 攔截器java

一.過濾器

主要的用途是過濾字符編碼、或者去除掉一些非法字符
過濾器須要寫兩部分,一是java類,二是web.xml配置web

1.java代碼,寫個類實現Filter接口(implements Filter)

public class MangerFilter implements Filter {
    public static  UserDaoI userDaoI;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        ApplicationContext content = 
        new ClassPathXmlApplicationContext("classpath:META-INF/applicationContext.xml");
        userDaoI = content.getBean(UserDaoI.class);
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest Request = (HttpServletRequest)servletRequest;
        HttpServletResponse Response = (HttpServletResponse) servletResponse;
        HttpSession session  =  Request.getSession();
        String path = Request.getRequestURI();
        String  userName = (String)session.getAttribute("userName");
        User user  = userDaoI.getUserByName(userName);
        session.setAttribute("managerPage",path);
        if(path.indexOf("index")==-1 && path.indexOf("resources")==-1)
            .........
        }else{
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
    @Override
    public void destroy() {
    }
}

這裏須要注意的是在spring中,實現Filter接口的類中不能使用@Autowired注入,須要使用init方法內手動加載配置文件的方法去調用。spring

2.在web.xml以下

<filter>
    <filter-name>login</filter-name>
    <filter-class>org.mshu.util.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>login</filter-name>
    <url-pattern>/login/*</url-pattern>
  </filter-mapping>

解釋:spring-mvc

<filter-name>隨便取
  <filter-class>過濾器的路徑
  <url-pattern>>過濾的路徑

小菜:

1.判斷是不是Ajax請求安全

String isAjax = request.getHeader("x-requested-with");

2.另一般出來編碼問題的時候會直接在web.xml中加上這段:這個不須要再寫java代碼,由於它指向的代碼是org.springframework.web.filter.CharacterEncodingFilter已經存在的。直接複製可用,無需改動。session

<!-- Spring字符集過濾器 -->
    <filter>
        <filter-name>SpringEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SpringEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

二.攔截器

相似面向切片的技術,攔截器要作的工做更可能是安全方面,好比用戶驗證,判斷是否登錄
日誌記錄,或者限制時間點訪問。
攔截器也是要寫兩部分,一部分是spring-mvc.xml,另外一部分是java類mvc

1.java代碼部分,須要一個繼承了HandlerInterceptorAdapter抽象類的方法

public class LoginIntercepter extends HandlerInterceptorAdapter{
    /**  
     * 在業務處理器處理請求以前被調用  
     * 若是返回false  
     *     從當前的攔截器往回執行全部攔截器的afterCompletion(),再退出攔截器鏈 
     * 若是返回true  
     *    執行下一個攔截器,直到全部的攔截器都執行完畢  
     *    再執行被攔截的Controller  
     *    而後進入攔截器鏈,  
     *    從最後一個攔截器往回執行全部的postHandle()  
     *    接着再從最後一個攔截器往回執行全部的afterCompletion()  
     */    
    @Override    
    public boolean preHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler) throws Exception {    
        String username =  (String)request.getSession().getAttribute("adminName");
        if(username == null){
//            request.getRequestDispatcher("/WEB-INF/content/login/index.jsp").forward(request, response);
            System.out.println("攔截來了");
            return false;
        }else{
            return true;
        }
    }    
    
    /** 
     * 在業務處理器處理請求執行完成後,生成視圖以前執行的動做    
     * 可在modelAndView中加入數據,好比當前時間 
     */  
    @Override    
    public void postHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler,    
            ModelAndView modelAndView) throws Exception {     
    }    
    
    /**  
     * 在DispatcherServlet徹底處理完請求後被調用,可用於清理資源等   
     *   
     * 當有攔截器拋出異常時,會從當前攔截器往回執行全部的攔截器的afterCompletion()  
     */    
    @Override    
    public void afterCompletion(HttpServletRequest request,    
            HttpServletResponse response, Object handler, Exception ex)    
            throws Exception {    
    }

2.spring-mvc.xml部分

<?xml version="1.0" encoding="UTF-8"?>  
   <beans xmlns="http://www.springframework.org/schema/beans"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xmlns:mvc="http://www.springframework.org/schema/mvc"  
      xsi:schemaLocation="http://www.springframework.org/schema/beans  
                       http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
                       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 
    <!--配置攔截器, 多個攔截器,順序執行 -->
<mvc:interceptors>    
    <mvc:interceptor>    
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login/**" />
        <mvc:exclude-mapping path="/resources/**" />
        <bean class="interceptor.LoginIntercepter"></bean>
    </mvc:interceptor>  
    <!-- 當設置多個攔截器時,先按順序調用preHandle方法,
    而後逆序調用每一個攔截器的postHandle和afterCompletion方法 -->  
</mvc:interceptors>

<mvc:mapping>表示攔截的路徑 /**爲全路徑
<mvc:exclude-mapping>表示不攔截的路徑。app

小菜:

若是你發現<mvc:exclude-mapping>彷佛不起做用,仍是被攔截,而且頁面出現了以下的錯誤jsp

Resource interpreted as Stylesheet but transferred with MIME type text/plain
Uncaught ReferenceError: $ is not defined

那麼請你把靜態文件加入免攔截<mvc:exclude-mapping>的隊伍中,如今看起來很合理,可是查bug的時候,,哎,鬼知道我經歷的什麼。ide

三.監聽器

用於監聽一些重要事件的發生,監聽器對象能夠在事情發生前、發生後能夠作一些必要的處理,
系統啓動時加載初始化信息
監聽器的功能是在項目啓動和銷燬時候搞事情:
和上面同樣兩部分:

1.監聽器類

實現ServletContextListener接口便可
public class initListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {

    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

2.編寫web.xml文件

<!-- 初始化監聽器-->
  <listener>
    <listener-class>org.yaoyan.util.initListener</listener-class>
  </listener>

<listener-class>是將要寫的監聽器類的路徑

相關文章
相關標籤/搜索