springboot 攔截器(interceptor)
阿新 • • 發佈:2019-01-22
springmvc中有兩種很普遍的AOP實現:
1.過濾器(Filter)
2.攔截器(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、靜態資源、首頁等等。