Spring Boot2.x 拦截器Interceptor对静态资源的处理

一,SpringBoot1.x已经做好了静态资源映射,但是2.x以上版本不行, 2.X以上版本拦截器默认会对静态资源进行拦截,

  WebMvcConfigurerAdapter(Spring4中方法,己过时),Spring5 己用WebMvcConfigurer替代

  解决办法,手动进行排除

  项目结构目录

  

 

 

   

  自定义的拦截器  

package com.zdx.crud.springboot.component;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器
 * @author zhangqiang
 * @create 2020-12-25 20:20
 */
@Component
public class LoginHandlerIntercepter implements HandlerInterceptor {
    //在目标方法执行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object loginUser = request.getSession().getAttribute("loginUser");
        System.out.println("loginUser" + loginUser);
        if (loginUser == null) {
            // 未登录,返回登录页面
            request.setAttribute("msg", "没有权限,请登录");
//            response.sendRedirect(request.getContextPath() + "/index.html");
            request.getRequestDispatcher("/index.html").forward(request, response);
            return false;
        } else {
            // 己登录,放行
            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 {

    }
}

 

 在 WebMvcConfigurer 进行配置, 自己定义的要 implements WebMvcConfigurer接口

package com.zdx.crud.springboot.config;

import com.zdx.crud.springboot.component.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.*;

import java.util.Arrays;

/**
 * WebMvcConfigurerAdapter(Spring4中方法,己过时),Spring5 己用WebMvcConfigurer替代
 * @author zhangqiang
 * @create 2020-12-22 20:31
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Autowired
    private LoginHandlerIntercepter loginHandlerIntercepter;

    //Servlet三大组件
    //1,Servlet
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(), "/myServlet");
        return servletRegistrationBean;
    }
    //2,Filter
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello", "/myServlet"));
        return filterRegistrationBean;
    }
    //3,Listener
    @Bean
    public ServletListenerRegistrationBean servletListenerRegistrationBean(){
        ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean(new MyServletListener());
        return servletListenerRegistrationBean;
    }

    /**
     * 配置自己的国际化语言解析,将其加入到Spring容器中
     * @return
     */
    @Bean
    public LocaleResolver localeResolver(){
        return  new LaugueLocaleResolver();
    }


    //自定义视图解析
    public void addViewControllers(ViewControllerRegistry registry) {
        // test
        registry.addViewController("/test").setViewName("success");
        // 去首页
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/index.html").setViewName("login");
        registry.addViewController("/main.html").setViewName("dashboard");
    }

    /**
     * 拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 通过 new LoginHandlerIntercepter() 方式
        // InterceptorRegistration addInterceptor = registry.addInterceptor(new LoginHandlerIntercepter());
        // 注解方式 注入loginHandlerIntercepter
        InterceptorRegistration addInterceptor = registry.addInterceptor(loginHandlerIntercepter);
        // 拦截配置
        addInterceptor.addPathPatterns("/**");
        // springBoot1.x已经做好了静态资源映射,但是2.x以上版本不行
        // 排除不拦截配置
        addInterceptor.excludePathPatterns("/webjars/**");//排除静态资源通过Pom文件引入的
        addInterceptor.excludePathPatterns("/static/**"); //排除静态资源
        // 自定义登录时不拦截的
        addInterceptor.excludePathPatterns("/");
        addInterceptor.excludePathPatterns("/user/login");
        addInterceptor.excludePathPatterns("/index.html");
    }

    /**
     * 注:指明你在拦截器中排除拦截的静态资源路径指向的是classpath下static路径
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
//        WebMvcConfigurer.super.addResourceHandlers(registry);
    }

}

 

posted @ 2020-12-26 13:05  弓长大仙  阅读(560)  评论(0)    收藏  举报