攔截器
攔截器是類似於過濾器的一個概念,其功能和過濾器一致,其主要概念不再贅述,想要了解的讀者可以查看博主關於Filter的文章
下面演示SpringMvc攔截器的使用。
環境搭建和博主的上一篇文章一致,這裏不再贅述。
直接創建一個HelloController類作爲處理器:
package com.ara.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello(){
System.out.println("Hello");
return "hello";
}
@RequestMapping("/world")
@ResponseBody
public String world(){
System.out.println("world");
return "world";
}
@RequestMapping("/ara")
@ResponseBody
public String ara(){
System.out.println("ara");
return "ara";
}
}
現在我們就想着有一個攔截器,攔截除了/hello的所有請求。
自定義一個攔截器MyInterceptor,這裏採用實現HandlerInterceptor接口的方式:
package com.ara.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
/**
* 該方法在攔截前執行
* @param request 請求的request
* @param response 響應
* @param handler 請求的處理器
* @return 返回是否放行 true:放行 false:不放行
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("處理請求前的代碼..........");
return true;
}
/**
* 該方法在請求處理完成後執行
* @param request 處理之後的request
* @param response 響應給客戶端的response對象
* @param handler 請求的處理器
* @param modelAndView 處理後返回的模型和視圖對象
* @throws Exception
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("處理器處理完請求後的代碼.........");
}
/**
* 該方法主要做一些清理工作 在攔截請求全部完成後執行
* @param request 請求的request對象
* @param response 響應的response對象
* @param handler 執行請求的處理器
* @param ex 異常對象
* @throws Exception
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("清理工作........");
}
}
這時,我們還要將該攔截器配置在Spring中,即在spring-mvc.xml文件中添加如下配置:
<!--攔截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--包括這個請求下面的所有請求-->
<mvc:mapping path="/**"/>
<!--除了這個請求的所有請求-->
<mvc:exclude-mapping path="/hello"/>
<!--配置處理的攔截器-->
<bean class="com.ara.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
現在就配置完畢了,我們開始測試,分別訪問/hello、/world和/ara,其控制檯結果如下:
- /hello
- /world
- /ara
到此,攔截器就實現成功了。