=================6、SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener ============

1、深入SpringBoot2.x过滤器Filter和使用Servlet3.0配置自定义Filter实战(核心知识)
简介:讲解SpringBoot里面Filter讲解和使用Servlet3.0配置自定义Filter实战

filter简单理解:人--->检票员(filter)---> 景点

1、SpringBoot启动默认加载的Filter
characterEncodingFilter
hiddenHttpMethodFilter
httpPutFormContentFilter
requestContextFilter

2、Filter优先级

Ordered.HIGHEST_PRECEDENCE
Ordered.LOWEST_PRECEDENCE

低位值意味着更高的优先级 Higher values are interpreted as lower priority
自定义Filter,避免和默认的Filter优先级一样,不然会冲突

注册Filter的bean FilterRegistrationBean
同模块里面有相关默认Filter
web->servlet->filter

3、自定义Filter
1)使用Servlet3.0的注解进行配置
2)启动类里面增加 @ServletComponentScan,进行扫描

3)新建一个Filter类,implements Filter,并实现对应的接口
4) @WebFilter 标记一个类为filter,被spring进行扫描
urlPatterns:拦截规则,支持正则

6)控制chain.doFilter的方法的调用,来实现是否通过放行
不放行,web应用resp.sendRedirect("/index.html");
场景:权限控制、用户登录(非前端后端分离场景)等

1、官网地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

packagenet.xdclass.demo.Filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;@WebFilter(urlPatterns= "/api/*", filterName = "loginFilter")public class LoginFilter  implementsFilter{/*** 容器加载的时候调用*/@Overridepublic void init(FilterConfig filterConfig) throwsServletException {System.out.println("init loginFilter");}/*** 请求被拦截的时候进行调用*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throwsIOException, ServletException {System.out.println("doFilter loginFilter");HttpServletRequest req=(HttpServletRequest) servletRequest;HttpServletResponse resp=(HttpServletResponse) servletResponse;String username= req.getParameter("username");if ("xdclass".equals(username)) {filterChain.doFilter(servletRequest,servletResponse);}else{resp.sendRedirect("/index.html");return;}}/*** 容器被销毁的时候被调用*/@Overridepublic voiddestroy() {System.out.println("destroy loginFilter");}}

filter

2、Servlet3.0的注解自定义原生Servlet实战
讲解:使用 Servlet3.0的注解自定义原生Servlet和Listener
1、自定义原生Servlet

@WebServlet(name = "userServlet",urlPatterns = "/test/customs")
public class UserServlet extends HttpServlet{

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("custom sevlet");
resp.getWriter().flush();
resp.getWriter().close();
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}

3、Servlet3.0的注解自定义原生Listener监听器实战
简介:监听器介绍和Servlet3.0的注解自定义原生Listener监听器实战

1、自定义Listener(常用的监听器 servletContextListener、httpSessionListener、servletRequestListener)
@WebListener
public class RequestListener implements ServletRequestListener {

@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("======requestDestroyed========");
}

@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("======requestInitialized========");

}

4、SpringBoot2.X自定义拦截器实战及新旧配置对比(核心知识)
简介: 讲解拦截器使用,Spingboot2.x新版本配置拦截拦截器和旧版本SpringBoot配置拦截器区别讲解
类似filter,但是不等同。
1、@Configuration
继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本)

packagenet.xdclass.demo.intecpter;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;//@Configuration
public class CustomOldWebMvcConfigurer extendsWebMvcConfigurerAdapter {@Overridepublic voidaddInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api/");super.addInterceptors(registry);}}

oldconfig

SpringBoot2.X 新版本配置拦截器 implements WebMvcConfigurer

packagenet.xdclass.demo.intecpter;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class CustomWebMvcConfigurer implementsWebMvcConfigurer  {@Overridepublic voidaddInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api2/*/**");registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");//.excludePathPatterns("/api2/xxx/**");//拦截全部 /*/*/**
WebMvcConfigurer.super.addInterceptors(registry);}}

2.X新版本confi

2、自定义拦截器 HandlerInterceptor (分2步骤:1.新建intercept实现接口 2配置类实现接口,注解注册,添加新建的拦截器到url映射)
preHandle:调用Controller某个方法之前
postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法
afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理

packagecom.atguigu.springboot.interceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;public class LoginIntercepter implementsHandlerInterceptor{/*** 进入controller方法之前*/@Overridepublic booleanpreHandle(HttpServletRequest request,HttpServletResponse response, Object handler)throwsException {System.out.println("LoginIntercepter------->preHandle");//String token = request.getParameter("access_token");//
//response.getWriter().print("fail");return HandlerInterceptor.super.preHandle(request, response, handler);}/*** 调用完controller之后,视图渲染之前*/@Overridepublic voidpostHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView)throwsException {System.out.println("LoginIntercepter------->postHandle");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}/*** 整个完成之后,通常用于资源清理*/@Overridepublic voidafterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throwsException {System.out.println("LoginIntercepter------->afterCompletion");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}}

logininterceptor

3、按照注册顺序进行拦截,先注册,先被拦截

拦截器不生效常见问题:
1)是否有加@Configuration
2)拦截路径是否有问题 ** 和 *
3)拦截器最后路径一定要 “/**”, 如果是目录的话则是 /*/

Filter
是基于函数回调 doFilter(),而Interceptor则是基于AOP思想
Filter在只在Servlet前后起作用,而Interceptor够深入到方法前后、异常抛出前后等

依赖于Servlet容器即web应用中,而Interceptor不依赖于Servlet容器所以可以运行在多种环境。

在接口调用的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

Filter和Interceptor的执行顺序

过滤前->拦截前->action执行->拦截后->过滤后

转载于:https://www.cnblogs.com/hellowq/p/10523407.html

【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener相关推荐

  1. springboot Interceptor拦截器excludePathPatterns失效

    springboot Interceptor拦截器excludePathPatterns失效 使用jwt和HandlerInterceptorAdapter做登录的拦截放行失效,其实更多时候不是配置文 ...

  2. 【SpringBoot】拦截器使用@Autowired注入接口为null解决方法

    [SpringBoot]拦截器使用@Autowired注入接口为null解决方法 参考文章: (1)[SpringBoot]拦截器使用@Autowired注入接口为null解决方法 (2)https: ...

  3. SpringBoot——使用拦截器拦截未登录用户

    前置知识SpringBoot配置拦截器基于HandlerInterceptor接口实现,关键三个方法 preHandle()执行目标之前 postHandle()执行目标之后 afterComplet ...

  4. SpringBoot与拦截器

    自定义拦截器 package com.buba.interceptor;import com.buba.pojo.User; import org.springframework.web.servle ...

  5. SpringBoot配置拦截器导致swagger失效

    问题背景: Springboot 启用拦截器后,Swagger无法访问 原因 拦截器拦截了所有的请求,导致swagger也被拦截,当在进行鉴权的的时候,可能需要传入一些特定的参数,或者请求头信息,这样 ...

  6. springboot设置拦截器的方法

    springboot设置拦截器的方式: 1.编写一个类,在类上面加上@Configuration注解,然后继承 WebMvcConfigurerAdapter. 重写父类的方法:addIntercep ...

  7. springboot项目拦截器中获取接口返回数据_Spring Boot自定义Annotation实现接口自动幂...

    在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重 ...

  8. springcloud springboot 异常拦截器 项目完善03

    springcloud springboot 异常拦截器 项目完善03 > 创建异常拦截器,在controller层没处理的异常抛出时,异常拦截器拦截后输入自定义的报错信息. 新建GlobalE ...

  9. SpringBoot的Web开发入门案例5—注册Servlets, Filter, Listener

    SpringBoot的Web开发入门案例5-注册Servlets, Filter, Listener 注册Servlet 创建MyServlet类 package com.blu.conf;impor ...

最新文章

  1. 【android-tips】installfailedinsufficientstorage解决方案
  2. QT使用xsl将xml为html,使用xslt 2.0将属性设置为根元素(Puting attributes to the root-element with xslt 2.0)...
  3. 【算法竞赛学习】金融风控之贷款违约预测-模型融合
  4. MySQL教程(三)—— MySQL的安装与配置
  5. 一只小蜜蜂(HDU-2044)
  6. debian nginx php mysql_记一次Debian下PHP环境的搭建(nginx+mariadb+PHP)!
  7. (c语言编程)出现错误:null undeclared identifier
  8. 指数体系与因素分析:概念、作用与种类
  9. 第5章分布式系统模式 Broker(代理程序)
  10. 【Unity】制作简易三维场景
  11. Springboot课程试题库管理系统毕业设计源码271129
  12. 图像处理网络资源【转】
  13. 论文浏览(20) Video Classification with Channel-Separated Convolutional Networks
  14. linux bt下载没速度慢,linux bt速度之王
  15. springboot2 security 登陆成功后无法跳转到指定页面,还是默认页面
  16. RR报文解析(三)利用LSR, DLSR计算RTT
  17. 数睿数据资讯 |《洞见・大咖说》对话数睿数据李争辉 探讨400%高增长背后的关键抓手
  18. 迷路的奶牛 Farmer John C++
  19. 2.15 Spring Framework 5.x 之ApplicationContext附加功能
  20. [NOIP2003提高组]侦探推理

热门文章

  1. 启用nginx status状态详解
  2. asp 导出excel数据 fso 单元格格式
  3. 微软Office Online服务安装部署及wopi代码实现--------Office Online服务器的安装
  4. dos下批量卸载apk文件
  5. IMEI, ESN, MEID
  6. 因 Redis 分布式锁造成的 P0 级重大事故,整个项目组被扣了绩效。。。
  7. 聊聊 Spring Cloud Config
  8. Java:假设车库有3个车位(可以通过boolean[]数组来表示车库)可以停车,写一个程序模拟多个用户开车离开,停车入库的效果。注意:车位有车时不能停车。
  9. 25.C++:最通俗的讲解,什么是面向过程?什么是面向对象?
  10. 青少年蓝桥杯_2020_steam考试_中级组_第四题