springmvc中有两种很普遍的AOP实现:
1.过滤器(Filter)
2.拦截器(Interceptor)
之前文章已经介绍过filter的用法,这里重点介绍interceptor。
1)定义interceptor:
public class SessionInterceptor extends HandlerInterceptorAdapter {
private static String[] IGNORE_URI = {"/login.jsp", "/login/","/login","/loginIndex", "/error"};
private static Logger log = LoggerFactory.getLogger(SessionInterceptor.class);
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean flag = false;
String url = request.getRequestURL().toString();
for (String s : IGNORE_URI) {
if (url.contains(s)) {
flag = true;
break;
}
}
if (!flag) {
Object obj = request.getSession().getAttribute(Constants.SESSION_USER);
if (null == obj) {//未登录
String servletPath = request.getServletPath();
log.error("session失效,当前url:" + url+";module Paht:"+servletPath);
if (request.getHeader("x-requested-with") != null &&
request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
response.setHeader("sessionstatus", "timeout");//在响应头设置session状态
response.setCharacterEncoding("text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("error");
} else {
response.sendRedirect(request.getContextPath()+"/user/loginIndex");
}
return false;
} else {
/*User user = (User)obj;
if(!RightUtil.hasRight(currentURLTemp, request)){
if(!"iisAdminTmp".equals(user.getName()) && !"/index".equals(targetURL)){
//response.sendRedirect(request.getContextPath()+"/login/login");//应该返回到没有权限的页面
//request.getRequestDispatcher("/login/login").forward(request, response);
return false;
}
}*/
}
}
return super.preHandle(request, response, handler);
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
2)在springboot中,指定interceptor:
public class MyMvcConfig extends WebMvcConfigurerAdapter {
/**
* 静态资源配置
*/
/*@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/img/**")
.addResourceLocations("classpath:/imgs/");
super.addResourceHandlers(registry);
}*/
/**
* 默认首页配置
*/
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/index");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
super.addViewControllers(registry);
}
/**
* interceptor配置
*/
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SessionInterceptor())
//添加需要验证登录用户操作权限的请求
.addPathPatterns("/**")
//排除不需要验证登录用户操作权限的请求
.excludePathPatterns("/css/**")
.excludePathPatterns("/js/**")
.excludePathPatterns("/images/**");
}
}
通过WebMvcConfigurerAdapter可以配置很多mvc的项,例如:interceptor、静态资源、首页等等。