文档章节

spring-boot中引入过滤器

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

最近项目中需要使用到过滤器进行签名的认证,刚开始使用的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
粉丝 3
博文 87
码字总数 37319
作品 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学习笔记

Spring Boot整合Redis spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六) spring boot 1.5.9 整合redis springboot集成redis详解 spring boot使用redisTemplate存...

OSC_fly
07/26
0
0
spring boot 之依赖

spring boot 虽然不强制使用特殊的依赖。但是其提供了一些非常高效的依赖。其中最有如下几个: spring-boot-starter-parent spring-boot-starter-data-jpa数据库连接的依赖。 spring-cloud-c...

乾坤刀
05/28
0
0
微服务下使用网关 Spring Cloud Gateway

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

Anoyi
06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

移除或自定义 WordPress 仪表盘欢迎面板

第一次登录 WordPress 后台仪表盘页面,默认都会显示 WordPress 的欢迎面板: 如果我们要移除这个面板,在主题的 functions.php 中添加下面的代码即可: 12 //移除 WordPress 仪表盘欢迎面...

james_laughing
8分钟前
0
0
HashMap实现原理及源码分析

HashMap实现原理及源码分析   哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,...

DemonsI
11分钟前
0
0
eggjs学习笔记

快速初始化 生成项目(要求最低的node版本8.x) npm i egg-init -gegg-init egg-example --type=simplecd egg-examplenpm i 启动项目 npm run dev 配置 环境配置会覆盖默认配置 config...

别人说我名字很长
14分钟前
1
0
Winform Timer控件时间间隔

sender as System.Timers.Timer).Interval = 23 * 60 * 60 * 1000.0;//将时间间隔改为23小时,23小时后重新发生timer_Elapsed事件。 //60000:时间间隔1分钟,300000:时间间隔5分钟,600000:...

笑丶笑
15分钟前
0
0
在win10系统下怎样快速切换任务视图

切换窗口:Alt + Tab 任务视图:Win + Tab (松开键盘界面不会消失) 切换任务视图:Win + Ctrl +左/右 创建新的虚拟桌面:Win + Ctrl + D 关闭当前虚拟桌面:Win + Ctrl + F4...

SummerGao
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部