15.SSM框架集~SpringMVC攔截器
本文是上一篇文章的後續,詳情點擊該鏈接
攔截器
Spring MVC中的攔截器(Interceptor)類似於Servlet中的過濾器(Filter),它主要用於攔截用戶請求並作相應的處理。例如通過攔截器可以進行權限驗證、記錄請求信息的日誌、判斷用戶是否登錄等
攔截器和過濾器的區別
過濾器針對的是所有的請求,攔截器主要針對的是控制單元。過濾器基於技術是Servlet,攔截器是SpringMVC提供,攔截器可以看作是細化的過濾器,用攔截器可以實現的功能,過濾器幾乎都可以實現。但是過濾器可以實現的功能,攔截器不一定可以實現。
攔截器 | 過濾器 |
攔截器不依賴與servlet容器 | 過濾器依賴與servlet容器 |
攔截器只能對action請求起作用 | 而過濾器則可以對幾乎所有的請求起作用 |
攔截器可以訪問action上下文、值棧裏的對象 | 過濾器不能訪問 |
在action的生命週期中,攔截器可以多次被調用 | 過濾器只能在容器初始化時被調用一次 |
攔截器可以獲取IOC容器中的各個bean,在攔截器裏注入一個service,可以調用業務邏輯。 | 過濾器不怎麼行 |
要使用Spring MVC中的攔截器,就需要對攔截器類進行定義和配置。通常攔截器類可以通過兩種方式來定義。
通過實現HandlerInterceptor接口,或繼承HandlerInterceptor接口的實現類(如HandlerInterceptorAdapter)來定義。
通過實現WebRequestInterceptor接口,或繼承WebRequestInterceptor接口的實現類來定義。
代碼實現
本節代碼是接第13章的那篇後續配置攔截器
<!-- 配置攔截器 -->
<mvc:interceptors>
<!-- 定義攔截器配置 -->
<mvc:interceptor>
<mvc:mapping path="/loginUser/"/><!-- 用於指定對攔截的 url -->
<bean id="inter1" class="com.alvin.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
代碼實現
public class MyInterceptor implements HandlerInterceptor {
//執行時機:進入控制單元之前執行
//如果方法返回值是true纔會繼續執行,如果是false 控制單元內容將不會執行
// handler--com.alvin.controller.UserController#login(String, String, HttpServletRequest)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//System.out.println("preHandle"+handler);
//[作用一]進行中post文亂碼的處理
request.setCharacterEncoding("utf-8");
//[作用二] 維護頁面的跳轉
//response.sendRedirect(request.getContentType()+"/wh.jsp");
//[作用三]進行權限校驗/登錄攔截
return true;
}
//執行的時機:在控制單元中做出相應之前 ,也就是在控制單元中第二步和第三步之間
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//[作用一]響應之前頁面跳轉的處理
// modelAndView.setViewName("redirect:/success2.jsp");
//[作用二] 對敏感詞語進行攔截替換
Map<String, Object> model = modelAndView.getModel();
//取出響應給客戶端數據
String msg = (String) model.get("msg");
if(msg.contains("槍支")){
//替換成功以後的字符串
String m2 = msg.replaceAll("棍棒", "**");
model.put("msg",m2);
}
System.out.println("postHandle");
}
//執行的時機:頁面渲染後時候
//垃圾回收的處理操作 資源關閉操作
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
SpringMVC中異常處理
系統中異常包括兩類:預期異常和運行時異常 RuntimeException,前者通過捕獲異常從而獲取異常信息, 後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。
系統的 dao、service、controller 出現都通過 throws Exception 向上拋出,最後由 springmvc 前端控制器交由異常處理器進行異常處理,如下圖
使用@ExceptionHandler註解處理異常
假如我們現在就遇到一個異常,怎麼辦呢?
解決
//value指向的那個值就是我上面畫紅線的那個
@ExceptionHandler(value = java.lang.NumberFormatException.class)
public ModelAndView handlerArithmeticException(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("redirect:/error.jsp");
return modelAndView;
}
@ExceptionHandler源碼
如果我們想要全局異常處理,那麼我們可以單獨創建一個包
//全局異常處理
@ControllerAdvice
public class GloableException {
@ExceptionHandler(value = java.lang.NumberFormatException.class)
public ModelAndView handlerArithmeticException(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("redirect:/error.jsp");
return modelAndView;
}
}
然後在配置文件裏面多掃描一個就好了
<context:component-scan base-package="com.alvin.controller,com.alvin.exception"></context:component-scan>
使用:SimpleMappingExceptionResolver
@Configuration
public class GloableException2 {
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties prop = new Properties();
prop.put("java.lang.NullPointerException","error1");
prop.put("java.lang.ArithmeticException","error2");
resolver.setExceptionMappings(prop);
return resolver;
}
}
自定義HandlerExceptionResolve
@Configuration
public class GloableException3 implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
if(e instanceof NullPointerException){
mv.setViewName("error1");
}
if(e instanceof ArithmeticException){
mv.setViewName("error2");
}
mv.addObject("msg",e);
return mv;
}}