在很多時候,需要攔截器來幫助我們完成一些特定的工作,比如獲取請求的參數,本身在request這種獲取數據就是一次磁盤的io,
如果在filter中獲取了參數,那么在controller中就不能獲取相關參數,,所以一般有時候需要從interceptor來進行相關功能的完成,本來可以在springboot中輕松使用interceptor,那么
可以在ssm中使用呢,是不是有點難度呢,主要一直使用那個后來一直沒有使用ssm,所以今天進行測試下,
首先,寫一個類HttpInterceptor 繼承HandlerInterceptorAdapter,或者 實現HandlerInterceptor
public class HttpInterceptor /*extends HandlerInterceptorAdapter*/ implements HandlerInterceptor{
然后看具體的代碼:
package com.yd.ydpdm.common.aspect; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; @Component public class HttpInterceptor /*extends HandlerInterceptorAdapter*/ implements HandlerInterceptor{ private static final String START_TIME = "requestStartTime"; @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { String url = request.getRequestURI().toString(); long start = (Long) request.getAttribute(START_TIME); long end = System.currentTimeMillis(); System.err.println("request completed. url:{}, cost:{}"+ url+(end - start)); System.out.println("11111"); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { String url = request.getRequestURI().toString(); long start = (Long) request.getAttribute(START_TIME); long end = System.currentTimeMillis(); System.out.println(start); System.out.println(end); System.err.println("request finished. url:{}, cost:{}"+ url+"-------------------------"+(end - start)); System.out.println("3"); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String url = request.getRequestURI().toString(); Map parameterMap = request.getParameterMap(); System.err.println("request start. url:{}, params:{}"+url+parameterMap); long start = System.currentTimeMillis(); System.out.println("2"); request.setAttribute(START_TIME, start); return true; } }
在前置攔截器中,return true 代表放行的意思,如果return false就不放行的意思.
如上攔截器就是進行測試的,記錄接口執行時間
在攔截器寫完之后還需要進行其他配置,
在springmvc中配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.yd.ydpdm.common.aspect.HttpInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
1. 如果不生效,可以配置:
<mvc:interceptors>
<bean class="com.yd.ydpdm.common.aspect.HttpInterceptor"></bean>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.yd.ydpdm.common.aspect.HttpInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
配置一個獨立的bean,是由於在<mvc:annotation-driven />這個里面有個攔截器的級別高,導致不生效,
2 然后我在測試過程出現了問題,就是配置了,然后所有的都寫了,就是不生效這個攔截器,所以找來很久原因,但是一直沒找出來\
最后具體原因就是寫的代碼不生效,,
最終原因是,在這個過程中代碼在編譯工具中沒有進行編譯,.再進行一次編譯之后就生效了

3 如果在前置攔截器中,retrun false


4 並不需要配置@component注解因為在項目初始化的時候就進行了初始化,因為在web.xml中文件是入口文件,配置了之后就會進行加載,,並不需要springbean進行初始化
