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 ...
随机推荐
- 6、 逻辑回归(Logistic Regression)
6.1 分类问题 在分类问题中,你要预测的变量
- vue数据响应式的一些注意点
有关对象属性值不触发视图更新的情况: Vue 不能检测到对象属性的添加或删除,由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 ...
- PHP实现简单的万年历
<?php /*********************** *** 功能:万年历 *** *** 时间:2015/05/23 *** ***********************/ //1. ...
- C# ASP.NET 手写板并生成图片保存
前端: @{ Layout = null; } <!DOCTYPE html> <html lang="zh-CN"> <head> <t ...
- id 和 name 区别
在html中:name指的是用户名称,ID指的是用户注册是系统自动分配给用户的一个序列号. name是用来提交数据的,提供给表单用,可以重复: id则针对文档操作时候用,不能重复.如:document ...
- Vue Login by Google
vue-google-oauth2 来源:https://www.npmjs.com/package/vue-google-oauth2
- MTCNN 人脸检测
demo.py import cv2 from detection.mtcnn import MTCNN # 检测图片中的人脸 def test_image(imgpath): mtcnn = MTC ...
- Solr的学习使用之(六)获取数据列表-SolrDocumentList
以下是我项目中获取新闻数据列表的写法,包括数据总量.数据列表,接下来会贴出分片查询(facet)等高级查询 基本的注释都有了: private ListPage<News> queryFr ...
- C#.Net 调用Java的Web Service
首先,得有一个web service地址:http://www.baiduc.om/XXServices?wsdl 然后在.net 项目中添加Web引用,并把地址给它输进去 第三.编码: using ...
- 树形dp专栏
前言 自己树形dp太菜了,要重点搞 219D Choosing Capital for Treeland 终于自己做了一道不算那么毒瘤的换根dp 令 \(f[u]\) 表示以 \(u\) 为根,子树内 ...