上一篇我们学习了 spring boot 利用Controller响应数据与响应页面。 一般的Web开发使用 Controller 基本上可以完成大部分需求,但是有的时候我们还是会用到 Servlet、Filter、Listener 等等。

在spring boot中添加自己的Servlet、Filter、Listener有两种方法

  • 代码注册: 通过ServletRegistrationBean、 FilterRegistrationBean 和ServletListenerRegistrationBean 获得控制。
  • 注解注册: 在SpringBootApplication 上使用@ServletComponentScan注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。

spring boot 中注册servlet

代码注册

  • 创建Servlet类:AaServlet.java。
public class AaServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost()"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<h1>AaServlet</h1>"); } } 
  • 通过ServletRegistrationBean注册。
//Project2Application.java@Beanpublic ServletRegistrationBean AaServletRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean(new AaServlet()); registration.addUrlMappings("/a"); return registration; } 
  • 运行测试。

访问:http://localhost:8080/a

测试

注解注册

  • 创建Servlet类:BbServlet.java。
@WebServlet(urlPatterns = "/b")
public class BbServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost()"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<h1>BbServlet</h1>"); } } 
  • 添加注解@ServletComponentScan。
@ServletComponentScan
@SpringBootApplication
public class Project2Application { public static void main(String[] args) { SpringApplication.run(Project2Application.class, args); } @Bean public ServletRegistrationBean AaServletRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean(new AaServlet()); registration.addUrlMappings("/a"); return registration; } } 
  • 运行测试。

访问:http://localhost:8080/b

测试


filter 和 listener的注册和servlet一样。这里就不多说了。

接下来说一下拦截器。

自定义拦截器

Spring提供了HandlerInterceptor(拦截器)。它的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。

spring boot提供了一些拦截器,我们可以直接拿来使用,比如:

  • ConversionServiceExposingInterceptor
  • CorsInterceptor
  • LocaleChangeInterceptor
  • PathExposingHandlerInterceptor
  • ResourceUrlProviderExposingInterceptor
  • ThemeChangeInterceptor
  • UriTemplateVariablesHandlerInterceptor
  • UserRoleAuthorizationInterceptor

我们也可以自己定义拦截器,定义拦截器的步骤大致分为:

1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写addInterceptors 方法。
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。

我们来亲自试一下:

  • 创建我们自己的拦截器
//MyInterceptor2
public class MyInterceptor1 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor1==========>在请求处理之前进行调用(Controller方法调用之前)"); return true;// 只有返回true才会继续向下执行,返回false取消当前请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor1==========>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor1==========>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)"); } } 
//MyInterceptor2
public class MyInterceptor2 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor2==========>在请求处理之前进行调用(Controller方法调用之前)"); return true;// 只有返回true才会继续向下执行,返回false取消当前请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor2==========>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor2==========>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)"); } } 

创建一个Java类继承WebMvcConfigurerAdapter,并重写addInterceptors 方法,添加拦截器。

//MyWebAppConfigurer
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**"); registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**"); super.addInterceptors(registry); } } 

测试:运行项目,随便访问一个路径,比如http://localhost:8080/test

浏览器会报错,不用管,看控制台。

结果

拦截器已经起作用了。

值得注意的是:只有经过DispatcherServlet 的请求,才会走拦截器链,我们自定义的Servlet 请求是不会被拦截的,比如我们自定义的Servlet地址是不会被拦截器拦截的。

但是过滤器不同。不管是属于哪个Servlet 只要复合过滤器的过滤规则,过滤器都会拦截。


本篇文章就先介绍到这里,如果哪里讲的不明白,请及时与我联系。

参考文章:Spring Boot 拦截器


作者:cleverfan链接:https://www.jianshu.com/p/fba5c0fd09bb來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/javaxiaoxin/p/8275348.html

springboot_4 spring boot 使用servlet,filter,listener和interceptor相关推荐

  1. Spring Boot整合Servlet,Filter,Listener,访问静态资源

    目录 Spring Boot整合Servlet(两种方式) 第一种方式(通过注解扫描方式完成Servlet组件的注册): 第二种方式(通过方法完成Servlet组件的注册) Springboot整合F ...

  2. Spring Boot自定义 Servlet Filter 的两种方式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 针 ...

  3. Spring Boot 注册 Servlet 的三种方法,真是太有用了!

    2019独角兽企业重金招聘Python工程师标准>>> 本文栈长教你如何在 Spring Boot 注册 Servlet.Filter.Listener. 你所需具备的基础 什么是 ...

  4. Spring Boot 注册 Servlet 的3种方式

    一.Spring Boot 注册 Spring Boot 提供了 ServletRegistrationBean, FilterRegistrationBean, ServletListenerReg ...

  5. servlet/filter/listener/interceptor区别与联系

    2019独角兽企业重金招聘Python工程师标准>>> servlet/filter/listener/interceptor区别与联系 博客分类: java 由于最近两个月工作比较 ...

  6. servlet,filter,listener区别

    时间的朋友 随笔 - 2314, 文章 - 3, 评论 - 101, 引用 - 0 servlet/filter/listener/interceptor区别与联系 一.概念: 1.servlet:s ...

  7. JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference 转载于:https://www.cnblogs.com/Jeremy2001 ...

  8. Spring Boot注册Servlet三大组件(Servlet, Filter, Listener)

    Spring Boot默认使用的Tomcat的Servlet容器,这个容器我们可以自己替换,比如替换成支持JSP的Servlet容器,这个容器已经帮我们注册好了一个Servlet(Dispatcher ...

  9. Spring Boot注册Servlet三大组建(Servlet、Filter、Listener)

    目录 理论 演示及代码 理论 在Spring Boot中使用下面3个函数可以注册Servlet.Filter.Listener ServletRegistrationBean FilterRegist ...

最新文章

  1. Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察
  2. 两概率分布交叉熵的最小值是多少?
  3. PHP的数据类型转换
  4. 阿里程序员受邀去华为面试,却因这点没被录取。
  5. 发布!天池布匹疵点检测大赛解决方案与Baseline(acc:85%左右,mAP:52%左右)
  6. Junit4集成到Maven工程
  7. 【BZOJ1037】【codevs1410】生日聚会,DP
  8. 使用Visual Studio 部署SharePoint时提示“路径中具有非法字符”
  9. JS和OC间的通信(使用JavaScriptCore)
  10. linux调度器(四)——主调度器与CFS
  11. CSS世界-第一、二章
  12. Teststand自定义测试报告
  13. C++ TCP Socket的使用(阻塞)
  14. VennDiagram 画文氏图/维恩图/Venn
  15. 将文件转换成json
  16. mysql连接字符串配置_配置数据库连接字符串ConnectionString
  17. BIM技术在住宅园区物业管理中的应用及其优势
  18. java基于sptingboot+vue的校园疫情防控系统 elementui
  19. php 用户名长度,Discuz! X2修改注册用户名长度限制解决方案
  20. 关于word页眉页脚的设置-页码不连续的问题

热门文章

  1. 开课吧python小课值得么-领导想提拔你,从来看的不是努力!
  2. python利器怎么编程-bluepy 一款python封装的BLE利器简单介绍
  3. 计算机二级python用什么书-计算机二级python考什么?
  4. 20行python代码的入门级小游戏-200行Python代码实现的2048小游戏
  5. python资料书-《Python数据分析与应用》——图书配套资料下载
  6. python装饰器函数-python函数装饰器之带参数的函数和带参数的装饰器用法示例
  7. python3爬虫实例-python3 网络爬虫 实例1
  8. python和php-PHP和Python如何选择?或许可以考虑这三个问题
  9. python 网站文件下载-python从网站上下载东西
  10. python100个免费实例-Python实例100个(基于最新Python3.7版本)