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

42 篇文章 1 订阅
11 篇文章 0 订阅

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

扩展资料:

过滤器与拦截器执行顺序

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

[外链图片转存中…(img-GkUULZik-1576676485366)]

springboot响应乱码参考资料:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懵懵懂懂程序员

如果节省了你的时间, 请鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值