1、java裏的攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器用於在某個方法或字段被訪問之前,進行攔截然後在之前或之後加入某些操作。
2、實現攔截器
a)實現HandlerInterceptor接口
package com.wc.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor implements HandlerInterceptor{ //在請求處理的方法之前執行 //如果返回true,執行下一個攔截器,如果返回false,則不執行 @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("-------處理前-------"); return true; } //在請求處理的方法執行之後執行 @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("-------處理後-------"); } //在DispatcherServlet處理後執行-----清理工作 @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub } }
b)配置攔截器
<!-- 攔截器的配置 --> <mvc:interceptors> <mvc:interceptor> <!-- /** 包括路徑及其子路徑 如果是/admin/* 攔截是的/admin/add,/admin/list etc. 而/admin/user/add不被攔截 如果是/admin/** 攔截 /admin/add,/admin/list, /admin/user/add etc. --> <mvc:mapping path="/**"/> <bean class="com.wc.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
3、如果被攔截能否到指定頁面?
使用HttpServletRequest和HttpServletResponse實現轉發
@Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("-------處理前-------"); resp.sendRedirect(req.getContextPath()+"/index.jsp"); return false; }
4、攔截器的應用----登陸攔截器
package com.wc.interceptor; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor implements HandlerInterceptor{ private List<String> allowedPass; //如果返回true表示不被攔截,執行下一個攔截器,如果返回false表示被攔截,則不執行 //允許哪些url不被攔截,哪些需要被攔截 @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Exception { // TODO Auto-generated method stub System.out.println("-------處理前-------"); String url = req.getRequestURL().toString(); //先判斷session中是否有 Object user = req.getSession().getAttribute("user"); if(user!=null) return true; for(String temp:allowedPass){ if(url.endsWith(temp)){ return true; } } resp.sendRedirect(req.getContextPath()+"/login.jsp"); return false; } //在請求處理的方法執行之後執行 @Override public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object obj, ModelAndView maw) throws Exception { System.out.println("-------處理後-------"); } //在DispatcherServlet處理後執行-----清理工作 @Override public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object obj, Exception exp) throws Exception { // TODO Auto-generated method stub } public void setAllowedPass(List<String> allowedPass) { this.allowedPass = allowedPass; } }
配置,在XML文件中配置攔截更加靈活
<!-- 攔截器的配置 --> <mvc:interceptors> <mvc:interceptor> <!-- /** 包括路徑及其子路徑 -攔截所有controller 如果是/admin/* 攔截是的/admin/add,/admin/list etc. 而/admin/user/add不被攔截 如果是/admin/** 攔截 /admin/add,/admin/list, /admin/user/add etc. --> <mvc:mapping path="/**"/> <mvc:exclude-mapping path=""/> <!-- 對應的攔截器 --> <bean class="com.wc.interceptor.LoginInterceptor"> <property name="allowedPass"> <list> <!-- 表示可通過攔截器的 --> <value>login.do</value> <value>add.do</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>