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 { } }