SpringBoot静态资源映射、拦截器、过滤器使用

1.静态资源映射

(1)自动映射静态资源文件

  SpringBoot默认提供了静态资源处理,使用WebMvcAutoConfiguration中的配置各种属性。

  建议使用SpringBoot的默认配置方式,提供的静态资源映射如下

  • classpath:/META-INF/resources
  • classpath:/resources
  • classpath:/static
  • classpath:/public

  这几个都是静态资源的映射路径,优先级顺序为:META-INF/resources > resources > static > public。

(2)自定义映射静态资源文件

  SpringBoot帮我们预留的路径下可以放置静态文件外,我们也可以根据需求自定义静态文件的放置位置,不过需要注意的时,在SpringBoot2.0前后,实现方式上是有变化的,SpringBoot2.0以前静态资源的拦截、存放位置的指定等都是通过继承WebMvcConfigurerAdapter来完成的,但是SpringBoot2.0以后需要通过实现WebMvcConfigurer重写相关的方法来完成配置。代码如下:

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/image/**").addResourceLocations("classpath:/image/");
    }
View Code

2.拦截器

  SpringBoot中使用拦截器,可在以下情况执行操作

  • 在将请求发送到控制器之前。
  • 在将响应发送给客户端之前。

  例如,使用拦截器在将请求发送到控制器之前添加请求标头,并在将响应发送到客户端之前添加响应标头。

  SpringBoot自定义拦截器需实现拦截器接口,使用注册接口对拦截器实例进行注册。

  自定义拦截器示例如下

@Component
public class DemoInterceptor implements HandlerInterceptor {

    /**用于在将请求发送到控制器之前执行操作。此方法应返回true,以将响应返回给客户端。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("请求开始  --- Url : " + request.getRequestURI());
        return true;
    }

    /**用于在将响应发送到客户端之前执行操作。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("请求处理  --- Url : " + request.getRequestURI());
    }

    /**用于在完成请求和响应后执行操作。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("请求结束  --- Url : " + request.getRequestURI());
        if (ex != null) {
            System.out.println("报错信息 : "+ ex);
        }
    }
}
View Code

  将拦截器实例注册到spring容器中示例如下

@Configuration
public class RequestConfig implements WebMvcConfigurer {

    @Resource
    private DemoInterceptor demoInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器,配置拦截地址
        registry.addInterceptor(demoInterceptor).addPathPatterns("/**");
    }
}
View Code

3.过滤器

  javax.servlet.Filter是一个接口,可以动态地拦截请求和响应信息,以变换或使用包含在请求或响应中的信息。

  过滤器使用场景

  • 数据压缩
  • 记录日志
  • 数据统计
  • 数据格式转换
  • 数据设置默认值
  • 权限认证、黑白名单
  • 数据加密/解密、签名效验

  使用注解方式自定义过滤器示例如下

/**自定义过滤器(注解方式)
 */
@Component
@WebFilter(filterName = "myFilter", urlPatterns = {"/*"}, description = "自定义过滤器")
public class MyCustomFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("before ...");
        // 过滤器放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("after ...");
    }

    @Override
    public void destroy() {
        System.err.println("过滤器销毁");
    }
}
View Code

  使用配置Bean方式自定义过滤器示例如下

/**自定义过滤器(配置 Bean 方式)
 */
public class MyCustomFilter implements Filter {

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("before ...");
        // 过滤器放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("after ...");
    }

}
View Code
@Configuration
public class FilterConfig {

    /**代码方式注册Bean
     */
    @Bean
    public FilterRegistrationBean customFilter(){
        FilterRegistrationBean<MyCustomFilter> filterBean = new FilterRegistrationBean<>();
        filterBean.setFilter(new MyCustomFilter());
        filterBean.setName("FilterController");
        filterBean.addUrlPatterns("/*");
        return filterBean;
    }
}
View Code
原文地址:https://www.cnblogs.com/bl123/p/14363020.html