springmvc3 攔截器,過濾ajax請求,判斷用戶登錄,攔截規則設置


web.xml設置:(/攔截所有請求)

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <!-- 所有的的請求,都會被DispatcherServlet處理 -->
    <url-pattern>/</url-pattern>
</servlet-mapping> 

spring MVC 配置文件攔截規則設置(沒有匹配的將不會攔截):

<!--配置攔截器, 多個攔截器,順序執行 -->  
    <mvc:interceptors>    
        <mvc:interceptor>    
            <!-- 匹配的是url路徑, 如果不配置或/**,將攔截所有的Controller -->  
            <mvc:mapping path="/" />  
            <mvc:mapping path="/account/**" />  <!-- 攔截用戶路徑 -->
            <mvc:mapping path="/image/**" />  <!-- 攔截圖片管理路徑 -->
            <mvc:mapping path="/upload/**" />  <!-- 攔截圖片下載路徑 -->
            <bean class="com.wzw.interceptor.LoginInterceptor"></bean>    <!-- 自定義攔截器路徑 -->
        </mvc:interceptor>  
        <!-- 當設置多個攔截器時,先按順序調用preHandle方法,然后逆序調用每個攔截器的postHandle和afterCompletion方法 -->  
    </mvc:interceptors>  

攔截器代碼:

package com.wzw.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.wzw.entity.Account;
public class LoginInterceptor extends HandlerInterceptorAdapter{
    /**  
     * 在業務處理器處理請求之前被調用  
     * 如果返回false  
     *     從當前的攔截器往回執行所有攔截器的afterCompletion(),再退出攔截器鏈 
     * 如果返回true  
     *    執行下一個攔截器,直到所有的攔截器都執行完畢  
     *    再執行被攔截的Controller  
     *    然后進入攔截器鏈,  
     *    從最后一個攔截器往回執行所有的postHandle()  
     *    接着再從最后一個攔截器往回執行所有的afterCompletion()  
     */    
    @Override    
    public boolean preHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler) throws Exception { 
        String requestUri = request.getRequestURI(); //請求完整路徑,可用於登陸后跳轉
        String contextPath = request.getContextPath();  //項目下完整路徑
        String url = requestUri.substring(contextPath.length()); //請求頁面
        System.out.print("發生攔截...");
        System.out.println("來自:"+requestUri+"的請求");
        Account user =  (Account)request.getSession().getAttribute("account");   
        if(user == null){  //判斷用戶是否存在,不存在返回登錄界面,繼續攔截,存在通過攔截,放行到訪問頁面
            /**
             * 攔截目錄下請求,是否為ajax請求
             *   是:無需登錄,直接訪問(因為我是用於首頁的ajax登錄請求)
             *   否:跳轉至登錄界面
             */
            if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ 
                //如果是ajax請求響應頭會有,x-requested-with  
                System.out.print("發生ajax請求...");
                return true;
                //response.setHeader("sessionstatus", "timeout");//在響應頭設置session狀態  
            }else{
                System.out.print("返回主頁...");
                request.getRequestDispatcher("/index.do").forward(request, response);//轉發到登錄界面 
            }  
            return false;  
        }else  
            return true;     
    }    
    
    /** 
     * 在業務處理器處理請求執行完成后,生成視圖之前執行的動作    
     * 可在modelAndView中加入數據,比如當前時間 
     */  
    @Override    
    public void postHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler,    
            ModelAndView modelAndView) throws Exception {     
        if(modelAndView != null){  //加入當前時間    
            modelAndView.addObject("var", "測試postHandle"); 
        }    
    }    
    
    /**  
     * 在DispatcherServlet完全處理完請求后被調用,可用於清理資源等   
     *   
     * 當有攔截器拋出異常時,會從當前攔截器往回執行所有的攔截器的afterCompletion()  
     */    
    @Override    
    public void afterCompletion(HttpServletRequest request,    
            HttpServletResponse response, Object handler, Exception ex)    
            throws Exception {    
    }    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM