1. springmvc 中的攔截器是由實現 HandlerInterceptor 或者繼承 HandlerInterceptorAdapter 來實現的。
2. 自定義實現一個攔截器的步驟:
a). 定義一個實現 HandlerInterceptor 接口 的類
public class MyInterceptor implements HandlerInterceptor{ /** * 在處理方法之前執行,一般用來做一些准備工作:比如日志,權限檢查 * 如果返回false 表示被攔截,將不會執行處理方法 * 返回true繼續執行處理方法 */ @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception { System.out.println("執行preHandler---------"+req.getRemoteHost()+req.getRemoteUser()); resp.sendRedirect("index.jsp"); return false; } /** * 在處理方法執行之后,在渲染視圖執行之前執行,一般用來做一些清理工作 */ @Override public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object handler, ModelAndView mv) throws Exception { System.out.println("執行postHandler"); } /** * 在視圖渲染后執行 一般用來釋放資源 */ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("執行afterCompletion"); } }
b) 在 springmvc 的配置文件中 ,添加攔截器配置
<mvc:interceptors> <!-- 定義一個攔截器的配置 --> <mvc:interceptor> <!-- mapping 指定哪些url被攔截 /*表示根路徑下的所有請求被攔截-/hello.do /**表示根路徑及其子路徑下的所有請求被攔截/user/add.do --> <mvc:mapping path="/**"/> <!-- 配置攔截器的路徑 --> <bean class="cn.sxt.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
c) 測試
3. 登錄攔截器實現
public class LoginInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //驗證請求的地址是否是登錄地址 如果是繼續往下執行 String uri=request.getRequestURI(); uri = uri.substring(uri.lastIndexOf("/")+1); if(uri.equals("login.do")){ return true; } //驗證session中是否有用戶存在 如果有 繼續執行 if(request.getSession().getAttribute("username")!=null){ return true; } //執行跳轉到登錄頁面 response.sendRedirect(request.getContextPath()+"/login.jsp"); return false; } }