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