1. 程式人生 > >研究基於spring通過對http請求資料的預處理(資料加解密、校驗、日誌)(2)過攔截器篇

研究基於spring通過對http請求資料的預處理(資料加解密、校驗、日誌)(2)過攔截器篇

上文已經詳細講解了如何對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的值進行校驗的話,需要使用上一篇文章講的知識了。