文档章节

spring-boot中引入过滤器

李阳-kevin
 李阳-kevin
发布于 08/11 15:05
字数 666
阅读 6
收藏 1

最近项目中需要使用到过滤器进行签名的认证,刚开始使用的spring-cloud-starter-zuul,让我在坑里美美的爬了好久!

        zuul虽然在一定程度上有过滤器的功能,但是他主要还是对请求进行路由,你进行路由的请求才进行过滤,无法路由的请求不能进行过滤,比如你想把api开头的请求路由根路径下,同时把其他url无规律请求使用/**拒绝,如果你同时配置了这两项,你会发现你陷入了一个“圈”,走不出来了,对一个请求会反复路由!
        所以要实现过滤器功能,还是使用原始过滤比较好,我们可以将项目根路径改为/api/,然后使用/*过滤所有请求,再在过滤器中对那些其他请求进行处理即可,示例代码如下:

 

首先定义过滤器及逻辑:

public class MyFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 只接受post方法
        if (!request.getMethod().equalsIgnoreCase("post")) {
            response.setStatus(HttpStatus.METHOD_NOT_ALLOWED.value());
            return;
        }

        //白名单
        if ( request.getRequestURI().contains("swagger")) {
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        //验证签名
        if (!sign.equals(newSign)) {
            response.setStatus(HttpStatus.OK.value());
            response.setContentType("application/json;charset=UTF-8");
            res.setCode(OperationCode.SIGN_ERROR);
            response.getOutputStream().write(JSONObject.toJSONBytes(res, SerializerFeature.QuoteFieldNames));
            return;
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
    }
}

使用@configuration将过滤器注入上下文中:

@Configuration
public class FilterConfiguration {
    @Bean
    public FilterRegistrationBean filterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        //注入过滤器
        registration.setFilter(new MyFilter());
        //拦截规则
        registration.addUrlPatterns("/*");
        //过滤器名称
        registration.setName("myFilter");
        //是否自动注册 false 取消Filter的自动注册
        registration.setEnabled(false);
        //过滤器顺序
        registration.setOrder(0);
        return registration;
    }

    @Bean(name = "myFilter")
    public Filter commonDataFilter() {
        return new MyFilter();
    }
}

 

另一种实现方式:

    过滤器注册还有另外一种实现方式:注解实现方式。过滤器还是上面定义的过滤器,只是不需要@configuration配置类进行注入。实现以下两步即可:

    1.在定义的过滤器上添加@WebFilter注解声明为一个过滤器,如:

@WebFilter(filterName = "myFilter", urlPatterns = "/*"),

    其中的过滤器名称可以随意命名,过滤路径/*表示过滤所有请求;

    2.在spring-boot启动类上添加如下注解,表示扫描过滤器所在的路径

@ServletComponentScan(basePackages = "com.kevin.config")

经过上面两段代码,就可以在spring-boot项目中实现过滤器功能了!

© 著作权归作者所有

共有 人打赏支持
李阳-kevin
粉丝 4
博文 98
码字总数 42467
作品 0
西安
程序员
Spring Boot整合MyBatis学习总结

公司的很多项目都陆陆续续引入了Spring Boot,通过对Spring Boot的接触了解发现其真的是大大地简化了开发、简化了依赖配置,很多功能注解一下就可以实现,真的是太方便了。下面记录了一个Spr...

zhuwensheng
06/29
0
0
spring boot 1.5.4 入门和原理(二)

1 spring boot入门 1.1 环境准备 JDK 7及以上 eclipse开发工具 项目管理工具Maven 本文采用、RELEASE(或1.5.2.RELEASE)调试通过。 spring-boot相关项目源码, 码云地址:https://git.oschi...

wyait
2017/09/18
0
0
Spring Boot 使用 Zuul 开发 API Gateway

Spring Boot 使用 Zuul 开发 API Gateway 《Spring Boot 实战开发》—— 基于 Gradle + Kotlin的企业级应用开发最佳实践 Spring Boot 是构建单个微服务应用的理想选择,但是我们还需要以某种...

程序员诗人
04/17
0
0
Spring Boot学习笔记

多线程 Spring @transactional注解和synchronized同步锁同时使用不能同步的问题 Synchronized和@Transactional 使用时,同步失效。 属性复制 spring的BeanUtils.copyProperties用法 文件上传...

OSC_fly
07/26
0
0
微服务下使用网关 Spring Cloud Gateway

Spring Cloud Gateway 工作原理 客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则将其发送到网关 Web 处理程序,此处理程序运行特定的请求过滤器链。 过滤器之...

Anoyi
06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

防止快速重复点击的两种思维

防止重复执行的两种思维 场景 下单时,提交按钮,因为网络卡顿或者手快重复点击,导致重复提交订单; 微博,更新个人状态或发表评论时,快速多次点击[发送]按钮,导致相同的信息发送多次. 解决思路 ...

黄威
38分钟前
0
0
在windows环境下使用Virtualbox虚拟Debian系统来运行Docker

标题绕口。 我之前一直使用 Virtualbox 和 homestead 来运行我的 PHP 开发环境。最近决心开始尝试 DevOps,使得开发、部署容器化,来化解人为操作失误和环境不兼容等问题造成的各种损失。就打...

zgldh
39分钟前
0
0
python map()

map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。(利用生成器的原理,并不马上返回值,...

南桥北木
53分钟前
0
0
分享几个 SpringBoot 实用的小技巧

前言 最近分享的一些源码、框架设计的东西。我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多;这次就分享一点接地气的: SpringBoot 使用中的一些小技巧。 算不上多高大上...

Java干货分享
54分钟前
2
0
day123-20181021-英语流利阅读-待学习

这款新字体,比记忆面包还管用 Lala 2018-10-21 1.今日导读 字体能跟学习效果有什么关系?你还别说,来自澳洲的心理学家和设计师们,还真创造了一款号称能够帮助大家记忆信息、增强学习效果的...

飞鱼说编程
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部