SpringBoot 2.x (6):使用Filter、Servlet、Listener
Filter的使用:
1.常见的默认Filter有:
characterEncodingFilter
hiddenHttpMethodFilter
httpPutFormContentFilter
requestContextFilter
2.Filter的优先级:
Ordered.HIGHEST_PRECEDENCE:最低优先级,值为int最大值
Ordered.LOWEST_PRECEDENCE:最高优先级,值为int最小值
低位值意味着更高的优先级
因此如果要自定义Filter,应该避免和默认的Filter优先级一样,不然会冲突
3.自定义Filter
可以使用Spring的FilterRegistrationBean,但是这种方式较为麻烦
所以这里采用Servlet3.0的方式:
结合实际应用的一个小Demo
Controller:
package org.dreamtech.springboot.controller; import java.util.HashMap;
import java.util.Map; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class DemoController {
/**
* 查看当前账户余额
*
* @return
*/
@RequestMapping("/login/account")
private Object account() {
Map<String, Object> modelMap = new HashMap<String, Object>();
modelMap.put("money", 1000);
return modelMap;
}
}
Filter:
package org.dreamtech.springboot.filter; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebFilter(urlPatterns = "/login/*", filterName = "loginFilter")
public class LoginFilter implements Filter { /**
* 容器加载时候调用
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("[ LoginFilter Init ]");
} /**
* 请求被拦截的时候调用
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("[ LoginFilter doFilter ]"); HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response; String username = req.getParameter("username"); if (username != null) {
chain.doFilter(req, resp);
} else {
System.out.println("[ username is null ]");
return;
}
} /**
* 容易被销毁的时候调用
*/
@Override
public void destroy() {
System.out.println("[ LoginFilter Destroy ]");
} }
特别注意:要在SpringBoot启动类中加入@ServletComponentScan注解
package org.dreamtech.springboot; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication
@ServletComponentScan
public class SpringbootApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
} }
启动后的结果:
访问:http://localhost:8080/login/account显示空白页面
访问:http://localhost:8080/login/account?username=xxx显示{"money":1000}
Servlet的使用:
package org.dreamtech.springboot.servlet; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = "/servlet/demo", name = "demoServlet")
public class DemoServlet extends HttpServlet { private static final long serialVersionUID = -428928425699550712L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("demo servlet");
resp.getWriter().flush();
resp.getWriter().close();
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
注意:和Filter使用相同地,要在SpringBoot启动类中加入@ServletComponentScan注解
Listener的使用:
常见的Listener有
ServletContextListener、HttpSessionListener、ServletRequestListener
ServletRequestListener:用于统计(比如文章的浏览次数等)
Controller:
@RequestMapping("/listener")
private Object listener() {
System.out.println("listener controller");
return "listener";
}
Listener:
package org.dreamtech.springboot.listener; import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener; @WebListener("/listener")
public class DemoListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request destroyed");
} @Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request initialized");
}
}
打印顺序应该是:每一次访问/listener都会打印这三行
request initialized
listener controller
request destroyed
ServletContextListener:用于资源加载
package org.dreamtech.springboot.listener; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; @WebListener("/listener")
public class DemoListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("context initialized");
} @Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("context destroyed");
}
}
打印顺序:
一开始打印context initialized
结束进程的时候打印context destroyed
只打印一遍
至于HttpSessionListener不怎么使用,就不介绍了
SpringBoot 2.x (6):使用Filter、Servlet、Listener的更多相关文章
- web.xml中的主要元素说明(listener, filter, servlet)
web.xml中加载的顺序为:context-param ---> listener ---> filter ---> servlet. listener:主要针对的是对象的操作,如 ...
- SpringBoot中使用Servlet,Filter,Listener
项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://ww ...
- SpringBoot 配置 Servlet、Filter、Listener
SpringBoot 配置 Servlet.Filter.Listener 在SpringBoot应用中,嵌入式的 Servlet 3.0+ 容器不会直接使用 ServletContainerInit ...
- SpringBoot注册Servlet、Filter、Listener
SpringBoot默认是以jar包的方式启动嵌入式的Servlet容易来启动SpringBoot的Web应用,没有web.xml文件 因此我们可以使用以下方式来注册Servlet.Filter.Li ...
- SpringBoot(四)-- 整合Servlet、Filter、Listener
SpringBoot中有两种方式可以添加 Servlet.Filter.Listener. 1.代码注册 通过ServletRegistrationBean. FilterRegistrationBe ...
- SpringBoot之Servlet、Filter、Listener配置
在SpringBoot中是不需要配置web.xml的,那么原来在web.xml中配置的Servlet.Filter.Listener现在怎么弄呢? SpringBoot提供了三种Bean Filter ...
- SpringBoot 源码解析 (七)----- Spring Boot的核心能力 - 自定义Servlet、Filter、Listener是如何注册到Tomcat容器中的?(SpringBoot实现SpringMvc的原理)
上一篇我们讲了SpringBoot中Tomcat的启动过程,本篇我们接着讲在SpringBoot中如何向Tomcat中添加Servlet.Filter.Listener 自定义Servlet.Filt ...
- 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener
=================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...
- 0017SpringBoot注册Servlet三大组件(Servlet、Filter、Listener)
由于SpringBoot默认是以jar包的形式启动嵌入式servlet容器来启动SpringBoot的web应用,所以没有web.xml文件,那么如何配置Servlet.Filter.Listener ...
- Servlet、Filter、Listener、Interceptor
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...
随机推荐
- Linux内核中工作队列的使用work_struct,delayed_work【转】
本文转载自:http://blog.csdn.net/zahuopuboss/article/details/43268983 初始化工作队列 调度工作队列 取消工作队列 #include <l ...
- POJ1651 Multiplication Puzzle —— DP 最优矩阵链乘 区间DP
题目链接:https://vjudge.net/problem/POJ-1651 Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65 ...
- 中文用户名的js检验正则
原文:http://www.jb51.net/article/20719.htm 好多网站需要用中文用户名注册,下面的代码就是客户端检测.强烈建议后台也要控制一下. username1: " ...
- 书写优雅的shell脚本(插曲)- /proc/${pid}/status
Linux中/proc/[pid]/status详细说明 博客分类: OS Linux多线程 [root@localhost ~]# cat /proc/self/status Name: cat ...
- LA-5052 (暴力)
题意: 给[1,n]的两个排列,统计有多少个二元组(a,b)满足a是A的连续子序列,b是B的连续子序列,a,b中包含的数相同; 思路: 由于是连续的序列,且长度相同,可以枚举一个串的子串,找出这个子串 ...
- [Selenium] Selenium 疑难杂症
1. jsclick 也不管用 Actions action = new Actions(driver); WebElement theRow = page.getInvisibleElement() ...
- 017--python基础作业
一.练习题: 1.使用while循环输入 1 2 3 ... 8 9 102.求1-100的所有数的和 3.输出 1-100 内的所有奇数 4.输出 1-100 内的所有偶数 5.求1-2+3-4 . ...
- 011--python基础知识
一.python类型 编译型和解释型 编译型: 优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行. 缺点:编 ...
- linux以字符为单位进行读写操作
1 所用函数 fgetc(FILE *fp):成功返回所读入的字符 失败为-1 fputc(int c,FILE *fp):第一个参数表示需要输出的字符 第二个参数表示输出的文件.成功返回输出的字符 ...
- 洛谷 - P2602 - 数字计数 - 数位dp
https://www.luogu.org/problemnew/show/P2602 第二道数位dp,因为“数位dp都是模板题”(误),所以是从第一道的基础上面改的. 核心思想就是分类讨论,分不同情 ...