zoukankan      html  css  js  c++  java
  • SpringBoot过滤器与拦截器(7)

    一、过滤器Filter

     创建过滤器的方法很简单,也传统的WEB项目一样,实现 Filter接口即可

    package com.hanzhenya.learnspringboot.filter;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
     
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
     
    public class MyFilter implements Filter {
     
        private static final Logger LOGGER=LoggerFactory.getLogger(MyFilter.class);
     
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
            HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
     
            LOGGER.info("自定义过滤器工作,当前请求URL:{}", httpServletRequest.getRequestURL());
            LOGGER.info("自定义过滤器工作,当前请求URI:{}", httpServletRequest.getRequestURI());
     
            //放行
            filterChain.doFilter(httpServletRequest, httpServletResponse);
        }
    }
    

      

    在SpringBoot中的步骤

            (1)实现 Filter 接口,实现其中的 doFilter() 方法;

            (2)添加 @Configuration 注解,将自定义 Filter 加入过滤链。

              SpringBoot的优势几乎就在于,所有的配置均有Java来控制。比如添加匹配过滤,addUrlPattern。

              order是拦截顺序,数值越小,拦截优先级越高。

    package com.hanzhenya.learnspringboot.config;
     
    import com.zhoutianyu.learnspringboot.filter.MyFilter;
    import com.zhoutianyu.learnspringboot.filter.MyFilter2;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
     
    @Configuration
    public class FilterConfig {
     
        @Bean
        public FilterRegistrationBean myFilter() {
            FilterRegistrationBean<MyFilter> filterContainer = new FilterRegistrationBean<>();
            filterContainer.setFilter(new MyFilter());
            //filter pattern
            filterContainer.addUrlPatterns("/*");
            //filter name
            filterContainer.setName("MyFilter");
            //filter order
            filterContainer.setOrder(1);
            return filterContainer;
        }
     
    }
    

    二、拦截器Interceptor

    过滤器与拦截器,这两个词汇其实本质上是一样的。都是对URL进行处理与拦截。

            Filter侧重点是要不要让某个请求进入我们系统。

            Interceptor侧重点是请求进入我们的系统后,进行预处理、后处理。

            编写拦截器最常见也是最简单的方法是,继承HandlerInterceptorAdapter。
     (1)编写一个拦截器并声明为一个Bean

    package com.hanzhenya.learnspringboot.interceptor;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.lang.Nullable;
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    @Component
    public class MyInterceptor extends HandlerInterceptorAdapter {
     
        private static final Logger LOGGER = LoggerFactory.getLogger(MyInterceptor.class);
     
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            LOGGER.info("资源预处理");
            return true;
        }
     
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
            LOGGER.info("资源后处理");
        }
     
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
            LOGGER.info("请求完成,清理资源");
        }
     
    }
    

    (2)将拦截器添加到WEB配置中。

    package com.hanzhenya.learnspringboot.config;
     
    import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    import com.zhoutianyu.learnspringboot.interceptor.MyInterceptor;
    import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
     
    import javax.annotation.Resource;
     
    @Configuration
    public class CustomWebConfigure implements WebMvcConfigurer {
     
        @Resource
        private MyInterceptor interceptor;
     
     
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(interceptor).addPathPatterns("/**")
                   .excludePathPatterns("/static/**");
        }
    }
    

      

  • 相关阅读:
    [RN] React Native 使用 react-native-camera 过程中报错 Found react-native-camera 'mlkit' but wasn't required.`
    [RN] React Native 拍照、从相册选择、录像的实现
    10月14日站立会议
    第四周PSP &进度条
    课堂站立会议学习
    10月13号站立会议
    10月12号站立会议
    10月11号站立会议
    10月10号站立会议
    10月9号站立会议
  • 原文地址:https://www.cnblogs.com/h-z-y/p/14601649.html
Copyright © 2011-2022 走看看