只拦截controller的请求, 基于aop,横切。
Spring MVC的拦截器类似于Servlet开发中的过滤器Filter, 用于对处理器进行预处理和后处理。
将拦截器按一定的顺序联结成一条链, 这条链称为拦截器链(InterceptorChain)。 在访问被拦截的方法或字段时,
拦截器链中的拦截器就会按其之前定义的顺序被调用。 拦截器也是AOP思想的具体实现。
configure xml
<!-- 拦截器 -->
<mvc:interceptors>
<bean class="cn.bitqian.interceptor.BaseInterceptor"></bean>
<!-- 用户拦截器 -->
<mvc:interceptor>
<!-- 拦截/user的请求 -->
<mvc:mapping path="/user/**"/>
<mvc:exclude-mapping path="/user/login"/>
<!-- 对应实现的拦截器 -->
<bean class="cn.bitqian.interceptor.UserInterceptor"></bean>
</mvc:interceptor>
<!-- 还可以配置多个.. -->
</mvc:interceptors>
对登录拦截
package cn.bitqian.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* 用户拦截器
* @author echo lovely
*
*/
public class UserInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("用户拦截器...");
Object user = request.getSession().getAttribute("user");
if (user == null) {
response.sendRedirect("redirect:/login.jsp");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
全局拦截器,对性能分析
package cn.bitqian.interceptor;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* 全局拦截器
* 1. 性能监控
* 2. 权限控制
* 3. 日志记录
* @author echo lovely
*
*/
public class BaseInterceptor extends HandlerInterceptorAdapter {
// 性能监控
Map<String, Long> performanceMonitorMap = new LinkedHashMap<>();
// 进入方法前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String sessionId = request.getSession().getId();
long threadId = Thread.currentThread().getId();
performanceMonitorMap.put(sessionId + threadId, System.currentTimeMillis());
System.out.println("全局拦截器...");
return true;
}
// 执行完方法,视图返回前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
// controller执行完,并且视图已经返回
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
String sessionId = request.getSession().getId();
long threadId = Thread.currentThread().getId();
Long start = performanceMonitorMap.get(sessionId + threadId);
Long end = System.currentTimeMillis();
System.out.println("该方法执行的时间:" + (end - start) * 1.0 / 1000 + "s");
}
}