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); @Override 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); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { super.postHandle(request, response, handler, modelAndView); }
2)在springboot中,指定interceptor:
@Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter { /** * 静态资源配置 */ /*@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/img/**") .addResourceLocations("classpath:/imgs/"); super.addResourceHandlers(registry); }*/ /** * 默认首页配置 */ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("forward:/index"); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); super.addViewControllers(registry); } /** * interceptor配置 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SessionInterceptor()) //添加需要验证登录用户操作权限的请求 .addPathPatterns("/**") //排除不需要验证登录用户操作权限的请求 .excludePathPatterns("/css/**") .excludePathPatterns("/js/**") .excludePathPatterns("/images/**"); } }
通过WebMvcConfigurerAdapter可以配置很多mvc的项,例如:interceptor、静态资源、首页等等。