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的更多相关文章

  1. Servlet、Filter、Listener、Interceptor

    首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...

  2. servlet、filter、listener、interceptor之间的区别和联系

    一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter: ...

  3. j2ee Servlet、Filter、Listener

    首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...

  4. JavaWeb之Filter、Listener

    昨天和大家介绍了一下JSON的用法,其实JSON中主要是用来和数据库交互数据的.今天给大家讲解的是Filter和Listener的用法. 一.Listenner监听器 1.1.定义 Javaweb中的 ...

  5. Filter、Listener 学习总结

    今天我们来介绍 Filter.Listener 这两个模块一些简单的知识和应用,接下来我们开始我们的正题 ! 1. Filter(过滤器) 1.1 对 Servlet 容器调用 Servlet 的过程 ...

  6. 基于注解的SpringMVC添加其他的Servlet、Filter以及Listener

    我们可以在AbstractAnnotationConfigDispatcherServletInitializer的实现类中重写onStartup(ServletContext servletCont ...

  7. SpringBoot中使用Servlet,Filter,Listener

    项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://ww ...

  8. SpringBoot 配置 Servlet、Filter、Listener

    SpringBoot 配置 Servlet.Filter.Listener 在SpringBoot应用中,嵌入式的 Servlet 3.0+ 容器不会直接使用 ServletContainerInit ...

  9. 【Web】servlet、filter和listener

    一般地,servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是:context-param -> listener -> filter -&g ...

  10. 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener

    =================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...

随机推荐

  1. python小感悟(初学者)

    计算机语言的起源: 在计算机刚发明出来的时候,是一大堆的机械硬件,然后技术人员开发了操作系统,操作系统是最底层的软件,负责与硬件沟通,执行其他软件的命令.由于计算机只能识别0和1两种特殊的机器语言,所 ...

  2. 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 ...

  3. [翻译]解释JavaScript中的类型转换

    原文地址:JavaScript type coercion explained 类型转换是将值从一种类型转换为另一种类型的过程(比如字符串转换为数值,对象转换为布尔值,等等).任何类型,无论是原始类型 ...

  4. Simple Live System Using Nginx

    1. Install nginx #Preinstalled directory install=/usr/local/nginx #Delete installed directory rm -rf ...

  5. Kintex 7五兄弟

    基KC705E 增强版 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡(136) 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡.由一 ...

  6. python特殊的类属性

    类C的特殊属性: C.__name__ 类C的名字 C.__doc__ 类C文档字符串 C.__bases__ 类C所有父类的元组 C.__dict__ 类C的属性 C.__module__ 类C所在 ...

  7. PHP实现session共享

    通过修改PHP-FPM配置文件,实现session会话共享: - 配置PHP使用memcached服务器共享Session信息 - 客户端访问两台不同的后端Web服务器时,Session 信息一致 环 ...

  8. leetcode x进制数 python3

    不少题目都是实现吧10进制数转换成x进制数,实际上都是一个套路,下面是7进制的,想换成什么进制,把7替换成相应数字即可,输出的是字符串 16,32进制这种有特殊要求的转不了,其他的应该通用 class ...

  9. 【技巧】Windows 10 1809无法接收1903解决方法

    这都7月份了,Windows10 1903都升级的有一个月了,然而我的1809的系统一直找不到1903的更新. 虽说1903会有bug,但还是想体验一把.周围同事都更新了,心里还是痒痒的. 于是每天都 ...

  10. 线程工具类 - CountDownLatch(倒计时器)

    CountDownLatch官方文档 一.原理 CountDownLatch是一个非常实用的多线程控制工具类.Count Down在英文中意为倒计时,Latch意为门闩,可以简单的将CountDown ...