zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/bl123/p/14363020.html
Copyright © 2011-2022 走看看