【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener
=================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相关推荐
- springboot Interceptor拦截器excludePathPatterns失效
springboot Interceptor拦截器excludePathPatterns失效 使用jwt和HandlerInterceptorAdapter做登录的拦截放行失效,其实更多时候不是配置文 ...
- 【SpringBoot】拦截器使用@Autowired注入接口为null解决方法
[SpringBoot]拦截器使用@Autowired注入接口为null解决方法 参考文章: (1)[SpringBoot]拦截器使用@Autowired注入接口为null解决方法 (2)https: ...
- SpringBoot——使用拦截器拦截未登录用户
前置知识SpringBoot配置拦截器基于HandlerInterceptor接口实现,关键三个方法 preHandle()执行目标之前 postHandle()执行目标之后 afterComplet ...
- SpringBoot与拦截器
自定义拦截器 package com.buba.interceptor;import com.buba.pojo.User; import org.springframework.web.servle ...
- SpringBoot配置拦截器导致swagger失效
问题背景: Springboot 启用拦截器后,Swagger无法访问 原因 拦截器拦截了所有的请求,导致swagger也被拦截,当在进行鉴权的的时候,可能需要传入一些特定的参数,或者请求头信息,这样 ...
- springboot设置拦截器的方法
springboot设置拦截器的方式: 1.编写一个类,在类上面加上@Configuration注解,然后继承 WebMvcConfigurerAdapter. 重写父类的方法:addIntercep ...
- springboot项目拦截器中获取接口返回数据_Spring Boot自定义Annotation实现接口自动幂...
在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重 ...
- springcloud springboot 异常拦截器 项目完善03
springcloud springboot 异常拦截器 项目完善03 > 创建异常拦截器,在controller层没处理的异常抛出时,异常拦截器拦截后输入自定义的报错信息. 新建GlobalE ...
- SpringBoot的Web开发入门案例5—注册Servlets, Filter, Listener
SpringBoot的Web开发入门案例5-注册Servlets, Filter, Listener 注册Servlet 创建MyServlet类 package com.blu.conf;impor ...
最新文章
- 【android-tips】installfailedinsufficientstorage解决方案
- QT使用xsl将xml为html,使用xslt 2.0将属性设置为根元素(Puting attributes to the root-element with xslt 2.0)...
- 【算法竞赛学习】金融风控之贷款违约预测-模型融合
- MySQL教程(三)—— MySQL的安装与配置
- 一只小蜜蜂(HDU-2044)
- debian nginx php mysql_记一次Debian下PHP环境的搭建(nginx+mariadb+PHP)!
- (c语言编程)出现错误:null undeclared identifier
- 指数体系与因素分析:概念、作用与种类
- 第5章分布式系统模式 Broker(代理程序)
- 【Unity】制作简易三维场景
- Springboot课程试题库管理系统毕业设计源码271129
- 图像处理网络资源【转】
- 论文浏览(20) Video Classification with Channel-Separated Convolutional Networks
- linux bt下载没速度慢,linux bt速度之王
- springboot2 security 登陆成功后无法跳转到指定页面,还是默认页面
- RR报文解析(三)利用LSR, DLSR计算RTT
- 数睿数据资讯 |《洞见・大咖说》对话数睿数据李争辉 探讨400%高增长背后的关键抓手
- 迷路的奶牛 Farmer John C++
- 2.15 Spring Framework 5.x 之ApplicationContext附加功能
- [NOIP2003提高组]侦探推理
热门文章
- 启用nginx status状态详解
- asp 导出excel数据 fso 单元格格式
- 微软Office Online服务安装部署及wopi代码实现--------Office Online服务器的安装
- dos下批量卸载apk文件
- IMEI, ESN, MEID
- 因 Redis 分布式锁造成的 P0 级重大事故,整个项目组被扣了绩效。。。
- 聊聊 Spring Cloud Config
- Java:假设车库有3个车位(可以通过boolean[]数组来表示车库)可以停车,写一个程序模拟多个用户开车离开,停车入库的效果。注意:车位有车时不能停车。
- 25.C++:最通俗的讲解,什么是面向过程?什么是面向对象?
- 青少年蓝桥杯_2020_steam考试_中级组_第四题