研究基於spring通過對http請求資料的預處理(資料加解密、校驗、日誌)(2)過攔截器篇
阿新 • • 發佈:2018-12-15
上文已經詳細講解了如何對request進行處理,本文主要是案例演示
spring MVC 的寫法
新增攔截器
- 定義一個攔截器
public class AppRequestInterceptor implements HandlerInterceptor {
/**
* 在請求處理之前執行,
* 該方法主要是用於準備資源資料的,
* 然後可以把它們當做請求屬性放到Request中
* @param request
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("AppRequestInterceptor====>preHandle");
// token 校驗
String token = request.getHeader("token");
if (token.equals("1")){
return true;
}
// 攔截器返回false則中斷請求,利用response進行跳轉到錯誤頁面
response.sendRedirect("/tokenError");
return false;
}
/**
* 該方法將在Controller執行之後,
* 返回檢視之前執行,ModelMap表示請求Controller處理之後返回的Model物件,所以可以在
* 這個方法中修改ModelMap的屬性,從而達到改變返回的模型的效果。
*/
@Override
public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("AppRequestInterceptor====>preHandle");
}
/**
* 該方法將在整個請求完成之後,
* 也就是說在檢視渲染之後進行呼叫,
* 主要用於進行一些資源的釋放
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("AppRequestInterceptor====>preHandle");
}
}
定義一個返回錯誤資訊的請求
@Controller
@RequestMapping("/")
public class ErrorController {
@RequestMapping("tokenError")
@ResponseBody
public String error(){
return JSON.toJSONString(new BackResult(false,"token錯誤"));
}
}
- 把定義的攔截器類加到SpringMVC中
修改spring-mvc.xml檔案
spring-mvc.xml宣告
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
使用mvc:interceptors標籤來宣告需要加入到SpringMVC攔截器鏈中的攔截器
<!--新增攔截器到springMVC中-->
<mvc:interceptors>
<!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 -->
<!--<bean class="xxx"/>-->
<mvc:interceptor>
<mvc:mapping path="/communicate/*"/>
<bean class="com.dsdj.Interceptor.AppRequestInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
由上面的示例可以看出可以利用mvc:interceptors標籤宣告一系列的攔截器,然後它們就可以形成一個攔截器鏈,攔截器的執行順序是按宣告的先後順序執行的,先宣告的攔截器中的preHandle方法會先執行,然而它的postHandle方法和afterCompletion方法卻會後執行。
在mvc:interceptors標籤下宣告interceptor主要有兩種方式:
(1)直接定義一個Interceptor實現類的bean物件。使用這種方式宣告的Interceptor攔截器將會對所有的請求進行攔截。
(2)使用mvc:interceptor標籤進行宣告。使用這種方式進行宣告的Interceptor可以通過mvc:mapping子標籤來定義需要進行攔截的請求路徑。
經過上述兩步之後,定義的攔截器就會發生作用對特定的請求進行攔截了
經測試成功:根據上一篇的內容,我們可以進行更多的處理,這裡就不贅述了,說明一下token獲取之後,在controller中還可以獲取,不會失效,而獲取request的值進行校驗的話,需要使用上一篇文章講的知識了。