1.过滤器的基本概念和实现

过滤器可以过滤所有的请求,对请求前后进行处理,可以获取并修改请求和响应中的信息,所以可以用来对一些无效的路径进行过滤或者进行URL级别的权限控制,同时可以对请求的信息进行敏感词过滤防止Sql注入。但是无法调用IOC容器的实例。

1.Filter 实现类 + @WebFilter + @ServletComponentScan:正常urlpattern的Filter,不可以设置Order顺序
2.Filter 实现类 + FilterRegistrationBean构造 + @Configuration:正常urlpattern的Filter,并且可以设置Order

1.1 自定义过滤实现Filter接口

实现Filter接口,并重写里面的三个方法,其中有三个默认的方法(init初始方法,doFilter核心过滤方法,destroy销毁方法)。

package com.lxc.common.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 自定义过滤器,Filter是被Servlet管理的,可以获取到Request请求、Response响应。* 对请求前后进行处理。* Springboot的过滤器,在web开发中可以过滤指定的url* 比如过拦截掉我们不需要的接口请求,同时也可以修改request和response内容* 过滤器的应用场景:* 1)过滤敏感词汇(防止sql注入)* 2)设置字符编码* 3)URL级别的权限访问控制* 4)压缩响应信息,设置响应内容**/
// 过滤器需要实现Filter类,其中有三个默认的方法(init初始方法,doFilter核心过滤方法,destroy销毁方法)
public class MyFilter implements Filter {Logger logger = LoggerFactory.getLogger(MyFilter.class);static final String TOKEN = "123456";/*** 内部接口集合*/public static List<String> INSIDE_URLS = Lists.newArrayList("/event/pushEvent");/*** 白名单接口集合*/public static List<String> WHITE_URLS = Lists.newArrayList("/user/login");@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {logger.info("MyFilter");HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;String ip = request.getRemoteAddr();String requestUrl = request.getRequestURI();logger.info("ip:{}"+ip);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.printf("%s %s 访问了 %s", sdf.format(new Date()), ip, requestUrl);if(WHITE_URLS.contains(requestUrl)){//白名单接口,直接通过filterChain.doFilter(servletRequest,servletResponse);return;}if(INSIDE_URLS.contains(requestUrl)){//进行校验,如token校验String token = request.getHeader("token");if(TOKEN.equals(token)){//内部接口,直接通过filterChain.doFilter(servletRequest,servletResponse);return;}else {//token校验不通过,重定向到登录页面response.setCharacterEncoding("utf-8");response.setContentType("application/json; charset=utf-8");PrintWriter out = response.getWriter();Map<String, String> resultMap = Maps.newHashMap();resultMap.put("code","10001");resultMap.put("desc","请求失败");out.print(JSONObject.toJSONString(resultMap));out.flush();out.close();}}logger.info("MyFilter");}@Overridepublic void destroy() {System.out.println("销毁过滤器");}
}

1.2注册过滤器

注册自定义过滤器,并设置自定义过滤器过滤的路径和顺序Order,order越小先执行。

package com.lxc.common.configuration;import javax.servlet.Filter;
import com.google.common.collect.Lists;
import com.lxc.common.filter.MyFilter;
import com.lxc.common.filter.MyFilterUseAnnotation;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 注册过滤**/
@Configuration
public class MyFilterRegistrationConfiguration {/*** 基础过滤器-注册过滤器,并对特定路由进行过滤* @return*/@Beanpublic FilterRegistrationBean<Filter> registerMyFilter(){FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new MyFilter());// 设置过滤的路由filterRegistrationBean.setUrlPatterns(Lists.newArrayList("/user/*"));// 设置过滤器优先级filterRegistrationBean.setOrder(2);return filterRegistrationBean;}//    @Bean
//    public FilterRegistrationBean<Filter> registerMyFilter1(){
//        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean();
//        filterRegistrationBean.setFilter(new MyFilterUseAnnotation());
//        filterRegistrationBean.setUrlPatterns(Lists.newArrayList("/user/*"));
//        filterRegistrationBean.setOrder(1);
//        return filterRegistrationBean;
//    }
}

1.3执行结果

1.4使用@WebFilter注解实现过滤器

package com.lxc.common.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 使用WebFilter实现过滤器功能,* 需要在SpringBootApplication启动累中添加注解@ServletComponentScan才能使用* 不可以设置有优先级,建议手动Bean**/
@WebFilter(filterName = "myFilterUseAnnotation", urlPatterns = {"/user/*"})
public class MyFilterUseAnnotation implements Filter {Logger logger = LoggerFactory.getLogger(MyFilterUseAnnotation.class);@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {logger.info("MyFilterUseAnnotation");filterChain.doFilter(servletRequest,servletResponse);logger.info("MyFilterUseAnnotation");}@Overridepublic void destroy() {}
}

在Spring中的过滤器相关推荐

  1. Spring 中的各种注解,光会用可不够哦!

    来源:https://digdeep.cnblogs.com/digdeep/p/4525567.html 1. Java中的注解 2. 使用 元注解 来自定义注解 和 处理自定义注解 3. spri ...

  2. spring中那些让你爱不释手的代码技巧

    紧接上文<spring中这些能升华代码的技巧,可能会让你爱不释手>.本文继续总结我认为spring中还不错的知识点,希望对您有所帮助. 一. @Conditional的强大之处 不知道你们 ...

  3. Spring中Controller层、Filter层、Interceptor层全局统一异常处理

    Controller层.Filter层.Interceptor层全局统一异常处理 SpringBoot为异常处理提供了很多优秀的方法,但是像我这种新手在处理异常时还是会觉得一头包,终于我痛定思痛,总结 ...

  4. java ssh过滤器_SSH中的过滤器,拦截器,监听器的一些基本认识

    今天被一个朋友问起在SSH的项目中,过滤器.拦截器.监听器都分别是什么,又都是干什么用的.结合目前学习到的和自己应用的体会,大概有以下几个方面. 1.过滤器:顾名思义就是过滤请求内容的,所谓的过滤就是 ...

  5. Spring Webflux –编写过滤器

    Spring Webflux是Spring 5+的一部分提供的新的响应式Web框架. 在传统的基于Spring MVC的应用程序( Servlet Filter , HandlerIntercepto ...

  6. (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)

    1.  过滤器跟拦截器的区别 在说拦截器之前,不得不说一下过滤器,有时候往往被这两个词搞的头大. 其实我们最先接触的就是过滤器,还记得web.xml中配置的<filter>吗~ 你应该知道 ...

  7. 厉害了,Spring中bean的12种定义方法!

    前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...

  8. 详解Spring中的CharacterEncodingFilter--forceEncoding为true在java代码中设置失效--html设置编码无效...

    在项目中有很多让人头疼的问题,其中,编码问题位列其一,那么在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?下面我们来看看Spring框架给我们提供过滤器CharacterEncodin ...

  9. Spring Security之过滤器链【探案】+源码剖析

    Spring Security之过滤器链[探案] Spring Security常用过滤器介绍 过滤器是一种典型的AOP思想,关于什么是过滤器,就不赘述了,接下来咱们就一起看看Spring Secur ...

最新文章

  1. 事务配置_SSH(五)- 使用注解方式配置事务管理
  2. 新工具一键安装Java环境!微软又双叒叕造福开发者
  3. 关于玻璃体手术的最终建议
  4. 微信h5网页关闭分享以及关闭当前页面
  5. 【clickhouse】MergeTree引擎的固定/自适应索引粒度
  6. Java开发入门教程!java垃圾回收机制描述正确
  7. 利用OpenIPMI监控服务器温度
  8. 8月份的To-Do List
  9. C# 中返回星期的函数
  10. 三步完美完成wordpress外链跳转
  11. Python开发工具PyCharm中文版安装与配置详细图文教程
  12. Win7 IE8首页强制成http://www.2345.com/?uuc
  13. oracle 数据库官网下载流程
  14. 内含干货PPT下载|一站式数据管理 DMS 关键技术解读
  15. 2021爱分析·产业数字化峰会圆满落幕:加快推动产业数字化,构建产业共生生态
  16. 戏人看戏--什么是Web3.0?区块链又是什么?如何写一个web3.0的界面?
  17. 非零基础自学Golang 第18章 HTTP编程(下) 18.2 HTTP服务端 18.2.2 启动HTTP服务器 18.2.3 启动HTTPS服务器
  18. java面试题怎么背?java面试题有哪些?
  19. 2018-9-3-vue的tabs表单代码的思考
  20. 通过python分析微信好友数据

热门文章

  1. 又一神作,Alibaba“M8级”大老总结微服务与事件驱动架构启蒙手册
  2. React-单页面(SPA)多路由(代替多页面)
  3. 项目组内个角色的职责说明,仅针对当前项目组,其他项目组慎用,呵呵
  4. Qt5对Excel表格简单、高效处理方法
  5. Linux中的setenv与export
  6. ios状态栏,导航栏,工具栏,tab栏的位置,附图
  7. Android开发类似苹果iOS 7的沉浸式状态栏
  8. 三角公式以及常见关系
  9. 技术水平真的很重要!技术详细介绍
  10. android拷机获取内存使用的脚本