SpringMVC中的攔截器
阿新 • • 發佈:2021-02-09
SpringMVC中的攔截器
攔截器的作用
SpringMVX中的攔截器類似於Servlet中的過濾器Filter,用於對處理器進行預處理和後處理
談到攔截器,還要提一個詞——攔截器鏈(Interceptor
Chain)。攔截器鏈就是將攔截器按一定順序聯結成一條鏈。在訪問被攔截的方法和欄位之時,攔截器鏈中的攔截器就會按其之前定義的順序被呼叫
攔截器預過濾器的區別:
- 過濾器是servlet規範中的一部分,任何java web工程都可以用
- 攔截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
- 過濾器在url-patten 中配置 /*之後,可以對所有要訪問的資源進行攔截。
- 攔截器只會攔截訪問的控制器的方法,如果訪問的是 jsp、html、css、image或者js是不會進行攔截的
- 細節:他也是AOP思想的具體應用
- 想要自定義攔截器,必須要求實現:HandlerInterceptor介面
編寫攔截器類
package com.wl.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定義攔截器
*/
public class MyInterceptor1 implements HandlerInterceptor {
//預處理,Controller方法執行前
//return true 放行,執行下一個攔截器,如果沒有,執行controller中的方法
//return false 不放行,
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System. out.println("MyInterceptor1執行了...");
return true;
}
}
springmvc.xml
<!--配置攔截器-->
<mvc:interceptors>
<!--配置攔截器-->
<mvc:interceptor>
<!--你要攔截的具體的方法-->
<mvc:mapping path="/user/*"/>
<!--不要攔截的方法-->
<!--<mvc:exclude-mapping path=""/>-->
<!--配置攔截器物件-->
<bean class="com.wl.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
測試
攔截器中的方法
preHandle:是controller方法執行之前攔截的方法
- 可以使用request或者response跳轉到指定頁面
- return true放行,執行下一個攔截器,如果沒有攔截器,則直接執行controller中的方法
- return false 不放行,不會執行controller中的方法
postHandle:是controller方法執行後執行的方法,在JSP檢視執行前
- 可以使用request或者response跳轉到指定頁面
- 如果指定了跳轉的頁面,那麼controller方法跳轉的頁面將不會顯示
package com.wl.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定義攔截器
*/
public class MyInterceptor1 implements HandlerInterceptor {
//預處理,Controller方法執行前
//return true 放行,執行下一個攔截器,如果沒有,執行controller中的方法
//return false 不放行,
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor1執行了...前");
//request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
return true;
}
//後處理方法,controller方法執行後,success.jsp執行之前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor1執行了...後");
//request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
}
//success.jsp頁面執行後,該方法會執行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor1執行了...最後");
}
}