springboot 2.x过滤器

1.什么是 springboot 2.x过滤器

  • 类似于检票员,检验游客的门票

2.springboot里的过滤器

ApplicationContextHeaderFilter
OrderedCharacterEncodingFilter
OrderedFormContentFilter
OrderedRequestContextFilter

3.过滤器的优先级

  • 低位值意味着更⾼的优先级 Higher values are interpreted as lower priority

4.自定义Filter,避免和默认的Filter优先级一样,不然会冲突

  • 注册Filter配置俩种方式

    • bean FilterRegistrationBean
    • Servlet 3.0 webFilter

5.使用新版servlet 3.0的注解开发自定义Filter

  • 在启动类里添加注解@ServletComponentScan ,进行扫描
  • 新建一个Filter类,implements Filter,并实现对应的接口
  • @WebFilter 标记一个类为filter,被spring扫描
  • urlPatterns:拦截规则,支持正则, urlPatterns为过滤的路径,filterName为过滤器的名称
  • 控制chain.doFilter的方法调用,来实现是否放行
  • 不放行,web应用resp.sendRedirect("/index.html")或者返回json字符串

使用范围:权限控制、⽤户登录状态控制

5.1 启动类里添加注解@ServletComponentScan

@SpringBootApplication     //标记此类为springboot 应用
@ServletComponentScan
public class MavenDemoApplication {public static void main(String[] args) {SpringApplication.run(MavenDemoApplication.class, args);}
}

5.2新建一个filter 包,包里创建一个Filter类

5.3类里实现Filter接口,并且类被标注为 @WebFilter, urlPatterns为过滤的路径(过滤/api/v1/pri/ 下所有的路径),filterName为过滤器的名称(登录过滤器)

5.4 在实现接口的类里重写3个方法

public void init(FilterConfig filterConfig) throws ServletException {}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}

public void destroy() {}

上述三个方法均在类加载时使用,初始化–过滤–销毁,过滤的过程发生在第二个过滤的时候
过滤过程中的代码:

@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("过滤开始");HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse rep = (HttpServletResponse) servletResponse;String token =req.getHeader("token");   //从headers中得到tokenif (StringUtils.isEmpty(token)){           // 如果header里面没有token时,从请求的参数里面拿tokentoken = req.getParameter("token");}if (!StringUtils.isEmpty(token)){            //如果还为空,直接返回json字符串或跳转index页面// 判断token是否合法User user = UserServiceImpl.sessionMap.get(token);  //在登录时在sessionMap里存了token,通过token取出user,若为空则未登录,若不为空则显示正确if(user !=null){filterChain.doFilter(servletRequest,servletResponse);}else{JsonData jsonData = JsonData.buildError("登录失败,token无效",-2);String jsonStr = objectMapper.writeValueAsString(jsonData);         //json转字符renderJson(rep,jsonStr);}}else {JsonData jsonData = JsonData.buildError("登录失败,token无效",-3);String jsonStr = objectMapper.writeValueAsString(jsonData);    renderJson(rep,jsonStr);}}private void renderJson(HttpServletResponse response,String json){response.setCharacterEncoding("UTF-8");response.setContentType("application/json");try(PrintWriter writer=response.getWriter()){writer.print(json);}catch (Exception e){e.printStackTrace();}}

springboot监听器

监听器:

应⽤启动监听器,会话监听器,请求监听器

作用:

  • ServletContextListener 应⽤启动监听
  • HttpSessionLisener 会话监听
  • ServletRequestListener 请求监听

常⽤的监听器

ServletContextListener、HttpSessionListener、ServletRequestListener)

代码:

@WebListener
public class CustomSessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("会话监听已开启");//HttpSessionListener.super.sessionCreated(se);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("会话监听已销毁");//HttpSessionListener.super.sessionDestroyed(se);}
}

SpringBoot2.X拦截器

1. 拦截器:

和过滤器⽤途基本类似

2.SpringBoot2.X拦截器使用步骤:

  • 2.1 创建一个类(列如:CustomWebConfigurer类)实现WebMvcConfigurer接口 拦截器配置类
  • 2.2 在类上加注解@COnfiguration
  • 2.3 在类里override 重写addInterceptors这个方法,在方法里可添加自定义的多个拦截器
  • 2.4 自定义拦截器
    • preHandle:调⽤Controller某个⽅法之前
    • postHandle:Controller之后调⽤,视图渲染之前,如果控制器Controller出现了
      异常,则不会执⾏此⽅法
    • afterCompletion:不管有没有异常,这个afterCompletion都会被调⽤,⽤于资
      源清理

拦截器的配置类 代码:

/*** 拦截器配置类*/
@Configuration
public class CustomWebConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(getLoginInterceptor()).addPathPatterns("/api/v1/pri/**");//可添加多个拦截器registry.addInterceptor(new TwoLoginIntercepter()).addPathPatterns("/api/v1/pri/**");WebMvcConfigurer.super.addInterceptors(registry);}@Beanpublic LoginIntercepter getLoginInterceptor(){return new LoginIntercepter();}
}

拦截器实现类代码:

public class LoginIntercepter implements HandlerInterceptor {private static final ObjectMapper objectMapper = new ObjectMapper();@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("LoginIntercepter preHandle...");String token =request.getHeader("token");   //从headers中得到tokenif (StringUtils.isEmpty(token)){token = request.getParameter("token");}if (!StringUtils.isEmpty(token)){// 判断token是否合法User user = UserServiceImpl.sessionMap.get(token);if(user !=null){return true;}else{JsonData jsonData = JsonData.buildError("登录失败,token无效",-2);String jsonStr = objectMapper.writeValueAsString(jsonData);renderJson(response,jsonStr);return false;}}else {JsonData jsonData =JsonData.buildError("未登录",-3);String jsonStr = objectMapper.writeValueAsString(jsonData);renderJson(response,jsonStr);return false;}//return HandlerInterceptor.super.preHandle(request, response, handler);}private void renderJson(HttpServletResponse response,String json){response.setCharacterEncoding("UTF-8");response.setContentType("application/json");try(PrintWriter writer=response.getWriter()){writer.print(json);}catch (Exception e){e.printStackTrace();}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("LoginIntercepter postHandle...");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("LoginIntercepter afterCompletion...");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

拦截器不生效的常见问题:

  • 是否有加@Configuration
  • 拦截路径是否有问题 ** 和 *
  • 拦截器最后路径⼀定要 /** 如果是⽬录的话则是 /*/

和Filter过滤器的区别

  • Filter和Interceptor⼆者都是AOP编程思想的体现,功能基本都可以实现
  • 拦截器功能更强⼤些,Filter能做的事情它都能做
  • Filter在只在Servlet前后起作⽤,⽽Interceptor够深⼊到⽅法前后、异常抛出前后等
  • filter依赖于Servlet容器即web应⽤中,⽽Interceptor不依赖于Servlet容器所以可以运⾏在
    多种环境。
  • 在接⼝调⽤的⽣命周期⾥,Interceptor可以被多次调⽤,⽽Filter只能在容器初始化时调⽤⼀
    次。
  • Filter和Interceptor的执⾏顺序 过滤前->拦截前->action执⾏->拦截后->过滤后

如何配置不拦截某些路径?

registry.addInterceptor(new
LoginIntercepter()).addPathPatterns("/api/v1/pri/**")

//配置不拦截某些路径,⽐如静态资源
.excludePathPatterns("//*.html","//*.js");

springBoot 2.x过滤器--监听器--拦截器相关推荐

  1. 过滤器-监听器-拦截器对比

    1,拦截器的概念     java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action 执行前阻止其执行,同时也提 ...

  2. springboot _配置过滤器、拦截器、使用原生servlet

    配置过滤器.拦截器.使用原生servlet 过滤器和拦截器的根本区别 过滤器是servlet规范规定的,只能用于web程序中,而拦截器是在spring容器中,它不依赖servlet容器. 拦截器属于S ...

  3. springboot中的过滤器、拦截器、监听器整合使用

    文章目录 controller层 过滤器 拦截器 拦截器介绍 使用拦截器 监听器 监听器介绍 使用监听器 修改启动类 controller层 用于测试 @RestController public c ...

  4. springboot二:过滤器、拦截器、静态资源访问

    一:springboot中的过滤器 过滤器是什么? 它是基于Servlet 技术实现的, 简单的来说,过滤器就是起到过滤的作用,在web项目开发中帮我们过滤一些指定的 url做一些特殊的 处理. 过滤 ...

  5. springBoot之过滤器和拦截器的使用

    在springBoot中,过滤器和拦截器的使用. 过滤器 概述 过滤器是什么? 简单的来说,过滤器就是过滤的作用,在web开发中过滤一些我们指定的url. 过滤器主要做什么? 过滤掉一些不需要的东西, ...

  6. springboot配置监听器、过滤器和拦截器

    监听器:listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件.监听域对象的属性发生 ...

  7. 过滤器、拦截器、监听器的区别与使用

    一.拦截器与过滤器的区别 过滤器 (Filter) 过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法 ...

  8. SpringBoot实现过滤器、拦截器与切片

    作者:七印miss juejin.im/post/5c6901206fb9a049af6dcdcf Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤 ...

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

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

最新文章

  1. 【Java学习笔记之五】java数组详解
  2. codelite14中文语言包_Windows下CodeLite完美支持中文的正确设置方法
  3. Kubernetes 已经成为云原生时代的安卓,这就够了吗?
  4. 使用C#实现网络时间同步功能
  5. pycharm安装lxml
  6. [收藏]网络营销十道羊皮卷
  7. 前端学习(3186):ant-design的button介绍按钮属性
  8. leetcode —— 965. 单值二叉树
  9. 【自学编程】来看一篇中专生如何在异常恶劣环境下自学编程
  10. Android自定义View之上拉、下拉列表 头部元素跟随 缩放、平移效果的实现
  11. gazebo打不开world
  12. 那本失去的《牛津高阶英汉双解词典》第6版 P2666-2665
  13. 人脸图像质量评价:FaceQnet
  14. CCFCSP 201712-1 最小差值
  15. python读取usb数据显示_在python中从各种usb设备读取和存储各种数据
  16. Vue+Vant 基于DatetimePicker进行二次开发,实现yyyyMMdd hh:mm:ss时间选择
  17. 华为OD机试(A、B卷)、机考,200分的题目整理如下,冲满分必备
  18. STM32F4之按键(二)
  19. 计蒜客-A1530 Abiyoyo
  20. ubuntu12.04 显卡 散热

热门文章

  1. 双评价:新时期国土空间规划的前提与基础
  2. 【数据结构】排序算法
  3. 虚拟机flink webui无法访问
  4. 二维测量--轮辋和轮胎的检查
  5. 暗黑破坏神练Key方法详解
  6. 饶毅: 美国“次尖”大学比“顶尖”大学更适合中国学生
  7. Matlab游戏制作代码
  8. Mac DosBox使用TT软件练习打字
  9. rtmp2flv rtmp直播转httpflv工具
  10. 【Filter过滤器案例】登录验证+敏感词过滤