隐藏

SpringBoot中使用过滤器和拦截器(Boot项目响应乱码问题解决)

发布:2022/3/17 15:35:28作者:管理员 来源:本站 浏览次数:1607

SpringBoot中使用过滤器和拦截器(boot项目响应乱码问题解决)


过滤器(Filter)和拦截器(Interceptor)是Web项目中常用的两个功能!


Filter:是Servlet规范提供的一种技术(接口)。作用在请求到达目标资源之前,Filter可以拦截请求进行过滤处理,然后放行,那么请求会到达目标资源;作用在响应从服务器发出之前,Filter可以进行过滤处理,然后放行,响应会到达客户端。


Filter的常见使用场景敏感词过滤、ip过滤、压缩响应 !


现有这样一个Api, 要实现的功能是计算请求耗时


@GetMapping("/test/{name}")

   public String getName(@PathVariable("name") String name){

       System.out.println("输出名字"+name);

       return "大帅哥"+name;

   }


 


1. 实现过滤器


/**

* @Author: zhihao

* @Date: 2019/12/18 16:56

* @Description: 过滤器1

* @Versions 1.0

**/

@Component //交给容器 不然不会生效, 过滤器依赖容器才能使用

@WebFilter(urlPatterns = {"/*"}) //拦截路径  拦截所有请求

public class TestFilter1 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 {

       long start = System.currentTimeMillis();

       //执行过滤的方法,每次拦截到请求,都会执行这个方法

       String name = servletRequest.getParameter("name");

       System.out.println("请求参数为:"+name);

       //放行请求

       filterChain.doFilter(servletRequest, servletResponse);

       System.out.println("结束了拦截器,耗时:"+(System.currentTimeMillis()-start));

   }


   @Override

   public void destroy() {

       System.out.println("在过滤器对象被销毁时,服务器软件会执行一次");

   }

}


 


2. 启动测试


发现项目一启动就输出了:初始化方法,在过滤器对象被创建时,服务器软件会执行一次, 项目关闭时输出:在过滤器对象被销毁时,服务器软件会执行一次,每次进行请求与响应的时候,都会执行doFilter()方法


可以配置多个过滤器,放行是放行给下一个过滤器!

拦截器

1. 自定义类实现HandlerInterceptor拦截器


@Component

public class TestInterceptor implements HandlerInterceptor {


   @Override

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

       System.out.println("controller之前调用 1");

       return true;   //返回true是正常放行

//        return false;

   }


   @Override

   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

       System.out.println("controller执行完毕后调用 2");

   }

   

    @Override

   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

       System.out.println("调用目标方法,完成视图渲染后执行 3");

   }

}


 


2. 配置拦截器配置类


@Configuration

public class WebConfig extends WebMvcConfigurationSupport {


   @Autowired

   private TestInterceptor testInterceptor;


   @Override

   protected void addInterceptors(InterceptorRegistry registry) {

       List<String> lanjluj = new LinkedList<>();

       lanjluj.add("/**");

       List<String> nolanj = new LinkedList<>();

       nolanj.add("/nolanj");

       registry.addInterceptor(testInterceptor) //可以添加多个拦截器 每个拦截单独配置路径

               .addPathPatterns(lanjluj) //添加拦截路径

               .excludePathPatterns(nolanj); //添加不拦截路径

   }

   

   /*@Bean    //解决响应中文乱码

   public HttpMessageConverter<String> responseBodyStringConverter() {

       StringHttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);

       return converter;

   }


   @Override

   protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

           converters.add(responseBodyStringConverter());

   }*/

   

}


 


3. 启动测试看看是否拦截到控制层请求

扩展资料:

过滤器与拦截器执行顺序

过滤器要先于拦截器执行,晚于拦截器结束。


32361-20180530095349427-444141538.png

扩展资料:

过滤器与拦截器执行顺序

过滤器要先于拦截器执行,晚于拦截器结束。