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学习笔记(7)容器以及容器的访问使用
一.容器 1.list列表 序列是python中最基本的数据结构,序列中的每个元素都分配一个数字,它的位置或索引,第一个索引是0,第二个索引是1,以此类推 Built-in mutable seque ...
- pgtclsh -- PostgreSQL TCLshell 客户端
SYNOPSIS pgtclsh [filename [argument...]] DESCRIPTION 描述 pgtclsh 是一个 Tcl shell 接口,用 PostgreSQL 数据库访问 ...
- 获取不到最新的url地址展示图片可以盖时间戳
如: $("#"+attachId).on('click', function() { params1 = []; ...
- vue中select的使用以及select设置默认选中
简介 今天写pc端引入vue,遇到了一个问题,就是我循环出select内的数据以后,发现原本默认显示第一条的select框变成了空白,要选择后才有显示,结果查了好多文档,讲的都不是很清楚,后来看到一句 ...
- matplotlib--直线和点
直线和点: import matplotlib.pyplot as plt import numpy as np x=np.linspace(-10,10,10) y=x**2 h=plt.plot( ...
- 在一个div上增加遮罩
有一个需求是给一个视频增加遮罩 我研究了下 抽象出来就是给一个div增加遮罩 原理是:最外层的div使用relative定位 然后里面放两个子div 一个是不被遮的 另一个是遮罩(用abs ...
- OC中保存自定义类型对象的持久化方法
OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定 ...
- window10 安装 docker
0.打开Hyper-V. 安装成功后,查看“任务管理器”: 1.下载安装程序. 2.一路"next"安装.安装成功后,桌面会出现图标: 3.双击该图标,成功运行后,右小角出现: 右 ...
- 20180910-Java 文档注释
Java 文档注释 Java只是三种注释方式.前两种分别是// 和/* */,第三种被称作说明注释,它以/** 开始,以 */结束. // /* */ /** */ 说明注释允许你在程序中嵌入关于程序 ...
- 提示”The following modules are missing or built with a different engine version”
一台机器使用自行编译版本引擎修改了工程后,另一台机器也使用自行编译版本引擎编辑该工程,有时会出现标题的提示 解决办法: 打开\Engine\Binaries\Win64\UE4Editor.modul ...