Filter 和Listener
Filter 和Listener
Filter : 过滤器
1.概念
浏览器发出请求访问服务器的资源,过滤器将请求拦截,完成一些特殊的功能。 作用:一般用于完成通过的操作。如:登陆验证、统一编码处理、敏感字符过滤等等。
2.入门
1.定义一个类,实现接口Filter
2.复写方法
3.配置拦截路径
3.1 注解
@WebFilter("/*") //访问所有资源之前,都会执行该过滤器
/user/ * 访问user目录下所有资源,执行
*.jsp 访问jsp后缀,执行
filterChain.doFilter(servletRequest,servletResponse);//放行
每一次请求被拦截资源时,都会执行。执行多次
3.2web.xml
4. 执行周期
1.放行前对request增强
2. 放行
3.回来时对response增强
5.拦截方式配置:资源被访问的方式
1. 注解配置:设置dispatcherTypes属性
1.request:默认值,浏览器直接请求资源
2.forward:转发访问资源
3.include:包含访问资源
4.error:错误跳转资源
5.async:异步访问资源 .
例:@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
@WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
2. web.xml配置
6.过滤器链(配置多个过滤器)
*执行顺序:如果有2个过滤器:过滤器1和过滤器2
1.过滤器1
2.过滤器2
3.资源执行
4.过滤器2
5.过滤器1
*过滤器先后问题:
1.注解配置:按照类名字符串比较规则,小的先执行
*如:AFilter 和 BFilter, 第一个先执行
2.web.xml配置:<filter-mapping>谁定义在上边,谁先执行
7.案例
1.登录校验
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//强转
HttpServletRequest request = (HttpServletRequest) req;
String uri = request.getRequestURI();
//1判断
if (uri.contains("/login.jsp")||uri.contains("/loginServlet")||uri.contains("/css/")||uri.contains("/js/")
||uri.contains("/fonts/")||uri.contains("/checkCodeServlet")){
chain.doFilter(req, resp);
}else {
Object user = request.getSession().getAttribute("user");
if (user!=null){
chain.doFilter(req, resp);
}else {
request.setAttribute("loginmsg","您尚未登录,请登录");
request.getRequestDispatcher("/login.jsp").forward(request,resp);
}
}
}
2.敏感词汇过滤
*分析:
对request对象进行增强
*增强对象的功能:
*设计模式:一些通用的解决固定问题的方式
1.装饰模式
2.代理模式
*概念:
1.真实对象:被代理的对象
2.代理对象:
3.代理模式:代理对象代理真实对象,增强对象功能
*实现方式:
1.静态代理:有一个类文件描述代理模式
2.动态代理:在内存中形成代理类
*实现步骤:
1.代理对象和恶真实对象实现相同接口
2.代理对象 = Proxy.newProxyInstance();
3.使用代理对象调用方法。
4.增强方法
代码如下:
package cn.zzz.web.filter;
@WebFilter("/sensitiveFilter")
public class SensitiveFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//创建代理对象,增强getParameter
ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强getParameter
if (method.getName().equals("getParameter")) {
//增强返回值
String value = (String) method.invoke(req, args);
if (value != null) {
for (String str : list) {
if (value.contains(str)) {
value = value.replace(str, "***");
}
}
}
return value;
}
if (method.getName().equals("getParameterMap")) {
Map<String, String[]> map = (Map<String, String[]>) method.invoke(req, args);
if (map != null) {
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
for (String s : map.keySet()) {
if (map.get(s)[0].contains(str)) {
map.get(s)[0] = map.get(s)[0].replace(str, "***");
}
}
}
}
return map;
}
if (method.getName().equals("getParameterValues")) {
String[] value = (String[]) method.invoke(req, args);
//需要把敏感词汇txt每一行的字符都搞到一个字符串数组中
if (value != null) {
for (String str : list) {
for (int i = 0; i < value.length; i++) {
if (value[i].contains(str)) {
value[i].replaceAll(str, "***");
}
}
}
}
return value;
}
return method.invoke(req, args);
}
});
chain.doFilter(proxy_req, resp);
}
private List<String> list = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
try {
//加载文件
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
//读取文件
FileInputStream fis = new FileInputStream(realPath);
BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
//将文件的每一行添加到list中
String line = null;
while ((line = br.readLine()) != null) {
list.add(line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Listener:监听器
*概念:web的三大组件之一
*事件监听机制
*事件
*事件源
*监听器
*注册监听
*ServletContextListener:监听ServletContext对象的创建和销毁
*方法:
1.contextInitialized
2.contextDestroyed
*步骤:
1.定义类,实现接口
2.复写方法
3.配置
3.1web.xml
3.2注解
Filter 和Listener的更多相关文章
- Servlet、Filter、Listener、Interceptor
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...
- servlet、filter、listener、interceptor之间的区别和联系
一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter: ...
- j2ee Servlet、Filter、Listener
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...
- JavaWeb之Filter、Listener
昨天和大家介绍了一下JSON的用法,其实JSON中主要是用来和数据库交互数据的.今天给大家讲解的是Filter和Listener的用法. 一.Listenner监听器 1.1.定义 Javaweb中的 ...
- Filter、Listener 学习总结
今天我们来介绍 Filter.Listener 这两个模块一些简单的知识和应用,接下来我们开始我们的正题 ! 1. Filter(过滤器) 1.1 对 Servlet 容器调用 Servlet 的过程 ...
- 基于注解的SpringMVC添加其他的Servlet、Filter以及Listener
我们可以在AbstractAnnotationConfigDispatcherServletInitializer的实现类中重写onStartup(ServletContext servletCont ...
- SpringBoot中使用Servlet,Filter,Listener
项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://ww ...
- SpringBoot 配置 Servlet、Filter、Listener
SpringBoot 配置 Servlet.Filter.Listener 在SpringBoot应用中,嵌入式的 Servlet 3.0+ 容器不会直接使用 ServletContainerInit ...
- 【Web】servlet、filter和listener
一般地,servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是:context-param -> listener -> filter -&g ...
- 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener
=================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...
随机推荐
- python小感悟(初学者)
计算机语言的起源: 在计算机刚发明出来的时候,是一大堆的机械硬件,然后技术人员开发了操作系统,操作系统是最底层的软件,负责与硬件沟通,执行其他软件的命令.由于计算机只能识别0和1两种特殊的机器语言,所 ...
- V-Parenthesis 前缀+ZKW线段树或RMQ
Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of length n and q questions. The i-th questio ...
- [翻译]解释JavaScript中的类型转换
原文地址:JavaScript type coercion explained 类型转换是将值从一种类型转换为另一种类型的过程(比如字符串转换为数值,对象转换为布尔值,等等).任何类型,无论是原始类型 ...
- Simple Live System Using Nginx
1. Install nginx #Preinstalled directory install=/usr/local/nginx #Delete installed directory rm -rf ...
- Kintex 7五兄弟
基KC705E 增强版 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡(136) 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡.由一 ...
- python特殊的类属性
类C的特殊属性: C.__name__ 类C的名字 C.__doc__ 类C文档字符串 C.__bases__ 类C所有父类的元组 C.__dict__ 类C的属性 C.__module__ 类C所在 ...
- PHP实现session共享
通过修改PHP-FPM配置文件,实现session会话共享: - 配置PHP使用memcached服务器共享Session信息 - 客户端访问两台不同的后端Web服务器时,Session 信息一致 环 ...
- leetcode x进制数 python3
不少题目都是实现吧10进制数转换成x进制数,实际上都是一个套路,下面是7进制的,想换成什么进制,把7替换成相应数字即可,输出的是字符串 16,32进制这种有特殊要求的转不了,其他的应该通用 class ...
- 【技巧】Windows 10 1809无法接收1903解决方法
这都7月份了,Windows10 1903都升级的有一个月了,然而我的1809的系统一直找不到1903的更新. 虽说1903会有bug,但还是想体验一把.周围同事都更新了,心里还是痒痒的. 于是每天都 ...
- 线程工具类 - CountDownLatch(倒计时器)
CountDownLatch官方文档 一.原理 CountDownLatch是一个非常实用的多线程控制工具类.Count Down在英文中意为倒计时,Latch意为门闩,可以简单的将CountDown ...