在很多时候,需要拦截器来帮助我们完成一些特定的工作,比如获取请求的参数,本身在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进行初始化