springboot 拦截器(interceptor)

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、静态资源、首页等等。


猜你喜欢

转载自blog.csdn.net/liuxiao723846/article/details/80656492