Filter:过滤器

1. 概念:

生活中的过滤器:净水器,空气净化器web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
过滤器的作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...

2. 快速入门:

1. 步骤:

     1. 定义一个类,实现接口Filter2. 复写方法3. 配置拦截路径1. web.xml2. 注解

2. 代码:

@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo1被执行了....");//放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}
}

3. 过滤器细节:

1. web.xml配置

         <filter><filter-name>demo1</filter-name><filter-class>cn.itcast.web.filter.FilterDemo1</filter-class></filter><filter-mapping><filter-name>demo1</filter-name><!-- 拦截路径 --><url-pattern>/*</url-pattern></filter-mapping>

2. 过滤器执行流程

     1. 执行过滤器2. 执行放行后的资源3. 回来执行过滤器放行代码下边的代码

3. 过滤器生命周期方法

     1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源2. doFilter:每一次请求被拦截资源时,会执行。执行多次3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

@WebFilter("/*")
public class FilterDemo3 implements Filter {/*** 每一次请求被拦截资源时,会执行。执行多次* @param req* @param resp* @param chain* @throws ServletException* @throws IOException*/public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("doFilter....");chain.doFilter(req, resp);}/*** 在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源* @param config* @throws ServletException*/public void init(FilterConfig config) throws ServletException {System.out.println("init....");}/*** 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源*/public void destroy() {System.out.println("destroy....");}}

启动服务器时会自动执行init方法,并且只执行一次

启动完服务器后,浏览器多次发起请求时,会执行doFilter方法

4. 过滤器配置详解

拦截路径配置:
1. 具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行
2. 拦截目录: /user/* 访问/user下的所有资源时, 过滤器都会被执行
3. 后缀名拦截: *.jsp      访问所有后缀名为jsp资源时,过滤器都会被执行
4. 拦截所有资源:/*     访问所有资源时,过滤器都会被执行
拦截方式配置:资源被访问的方式
注解配置:设置dispatcherTypes属性1. REQUEST:默认值。浏览器直接请求资源2. FORWARD:转发访问资源3. INCLUDE:包含访问资源4. ERROR:错误跳转资源5. ASYNC:异步访问资源
//浏览器直接请求index.jsp资源时,该过滤器会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
//只有转发访问index.jsp时,该过滤器才会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//浏览器直接请求index.jsp或者转发访问index.jsp。该过滤器才会被执行
@WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,DispatcherType.REQUEST})
web.xml配置设置<dispatcher></dispatcher>标签即可

5. 过滤器链(配置多个过滤器)

     * 执行顺序:如果有两个过滤器:过滤器1和过滤器21. 过滤器12. 过滤器23. 资源执行4. 过滤器25. 过滤器1 * 过滤器先后顺序问题:1. 注解配置:按照类名的字符串比较规则比较,值小的先执行* 如: AFilter 和 BFilter,AFilter就先执行了。2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行

4. 案例:

案例1_登录验证

 需求:1. 访问day17_case案例的资源。验证其是否登录2. 如果登录了,则直接放行。3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。

@WebFilter(filterName = "LoginFilter")
public class LoginFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//0. 强制转换HttpServletRequest request = (HttpServletRequest) req;//1. 获取资源请求路径String uri = request.getRequestURI();//2. 判断是否包含登陆相关资源路径if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/js/") || uri.contains("/css/") || 1uri.contains("/fonts/") || uri.contains("/checkServlet")){// 包含,发起请求的是登陆界面,放行chain.doFilter(req,resp);}else{// 不包含,需要验证用户是否登录//3. 从获取session中获取userObject user = request.getSession().getAttribute("user");if (user!=null){chain.doFilter(req,resp);}else {// 没有登录,跳转登陆界面request.setAttribute("login_msg", "您未登录,请登录");request.getRequestDispatcher("/login.jsp").forward(request, resp);}}}public void init(FilterConfig config) throws ServletException {}public void destroy() {}
}

案例2_敏感词汇过滤

 需求:1. 对day17_case案例录入的数据进行敏感词汇过滤2. 敏感词汇参考《敏感词汇.txt》3. 如果是敏感词汇,替换为 *** * 分析:1. 对request对象进行增强。增强获取参数相关方法2. 放行。传递代理对象* 增强对象的功能:* 设计模式:一些通用的解决固定问题的方式1. 装饰模式2. 代理模式* 概念:1. 真实对象:被代理的对象2. 代理对象:3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的* 实现方式:1. 静态代理:有一个类文件描述代理模式2. 动态代理:在内存中形成代理类* 实现步骤:1. 代理对象和真实对象实现相同的接口2. 代理对象 = Proxy.newProxyInstance();3. 使用代理对象调用方法。4. 增强方法* 增强方式:1. 增强参数列表2. 增强返回值类型3. 增强方法体执行逻辑
package cn.itcast.web.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;@WebFilter("/SensitiveWordsFilter")
public class SensitiveWordsFilter implements Filter {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() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 增强个体Parameter方法// 判断是否是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.replaceAll(str, "****");}}}}return null;}});chain.doFilter(proxy_req, resp);}private List<String> list = new ArrayList<>();public void init(FilterConfig config) throws ServletException {try {// 加载文件ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("WEB-INF/classes/敏感词汇.txt");// 读取文件BufferedReader br = new BufferedReader(new FileReader(realPath));// 将文件中的每一行数据加载到list中String line = null;while((line=br.readLine())!=null){list.add(line);}br.close();System.out.println(list);}catch (Exception e){System.out.println(e.getStackTrace());}}public void destroy() {}
}

JavaEE之Filter过滤器、登录状态验证、敏感词汇过滤相关推荐

  1. Java基于Socket实现聊天、群聊、敏感词汇过滤功能

    首先的话,这个代码主要是我很久以前写的,然后当时还有很多地方没有理解,现在再来看看这份代码,实在是觉得丑陋不堪,想改,但是是真的改都不好改了- 所以,写代码,规范真的很重要. 实现的功能: 用户私聊 ...

  2. 动态代理的分析以及利用动态代理模式进行敏感词汇过滤

    动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...

  3. 【敏感词汇过滤算法】基于DFA-前缀树的敏感词汇过滤算法(项目实用)

    在敏感词汇过滤这块,不同的算法所造成的性能差异是非常大的,选择一个合适的算法非常重要.因为以前做算法的时候做过类似前缀树的字符串匹配之类的算法,所以一开始就打算用前缀树做的,后面了解了一下DFA的相关 ...

  4. PHP敏感词汇过滤SDK(树形结构遍历命中违禁词)

    先介绍一下匹配敏感词原理吧,因为没有工具,画的很糙,有疑问直接联系我.(绿色箭头代表命中敏感词,灰色:未命中) base 确定有穷自动机(DFA)算法 比如说"可以"是敏感词,那么 ...

  5. 优秀博客 --敏感词汇过滤

    2019独角兽企业重金招聘Python工程师标准>>> 敏感词汇过滤 http://www.cnblogs.com/chenssy/p/3751221.html#2966041 树上 ...

  6. 【Filter过滤器案例】登录验证+敏感词过滤

    登录验证 >>> 思路: >>> 先假设拦截所有资源(Servlet, jsp...均不让访问),判断资源是否与登录有关: >>> 1.与登录相关 ...

  7. asp.net登录状态验证

    文章:ASP.NET 登录验证 文章:ASP.NET MVC下判断用户登录和授权状态方法 文章:.net学习笔记---HttpHandle与HttpModule 第一篇文章,介绍了 1)早期的Base ...

  8. html登录状态验证,Token验证登录状态的简单实现

    设计思路 用户发出登录请求,带着用户名和密码到服务器经行验证,服务器验证成功就在后台生成一个token返回给客户端 客户端将token存储到cookie中,服务端将token存储到redis中,可以设 ...

  9. 用js验证敏感词汇(汉字)

    这里不多说,直接来代码: <SCRIPT SRC="checks.js"> </SCRIPT>//敏感词汇都写入在checks.js里 <script ...

  10. Filter - 通过拦截器与动态代理实现敏感词汇过滤

    需求:将敏感词汇.txt文件中的词语过滤为 -> "***" 分析: 首先加载文档,将文档中的词汇纳入集合中备用,方便后期比对使用. 使用Proxy动态代理将request对 ...

最新文章

  1. 在Windows Server 2008 R2下搭建jsp环境(四)-在测试的过程中可能出现的问题
  2. Spring AOP / AspectJ AOP 的区别?
  3. 基于Text-CNN模型的中文文本分类实战
  4. Go语言-信号os.Interrupt和信号syscall.SIGTERM的应用
  5. 设计模式(Python)-观察者模式
  6. tempdb数据库清理_如何检测和防止TempDB数据库意外增长
  7. drf 频率组件 META字典详情
  8. streamlit + opencv/YOLOv3 快速构建自己的图像目标检测demo网页(七)
  9. 如何在 Mac 上设置自定义锁屏信息?
  10. 从零基础入门Tensorflow2.0 ----四、17.生成tfrecords文件
  11. JakartaEE 文件的上传和下载
  12. 【毕业设计】Spring Boot 和 Vue 的图书管理系统
  13. 基于安卓的宠物店预约商城APP源码
  14. Webservice接口调用工具类
  15. 华为养狼,喂的是真肉
  16. seo入门到精通_SEO入门到精通需要这10个步骤
  17. 思迈特软件Smartbi:公安大数据的3个发展阶段
  18. 三星s8html查看器,【三星GALAXYS8评测】屏幕:全视屏显示素质经得起数据检验_三星 GALAXY S8_手机评测-中关村在线...
  19. android中android:wight详解
  20. c语言逻辑运算符两侧运算对象,逻辑运算符两侧运算对象的数据类型是什么?...

热门文章

  1. C++轻量级Json解析工具—TinyJson
  2. jieba库(jieba库的介绍以及分词原理,jieba的三种模式和常用函数,利用Jieba模块进行中文词语的统计)
  3. 爱客影院自动采集源码v3.5.5
  4. pr 无法启动因为计算机丢失,pramtlib.dll_“PR打不开,因为计算机丢失TimeWarpFilter.dll”是怎么回事?怎么办啊?_prccamtlib.dll...
  5. webm格式怎么转换成mp4
  6. 免费java模板下载安装_java程序员免费简历模板下载
  7. python源码剖析_Python源码剖析的作品目录
  8. mysql配置文件(完整版)
  9. linux 使用VI命令怎么删除输入内容,linux系统vi编辑器常用命令及使用方法。
  10. java基础知识大全(带练习题)