返回顶部
首页 > 资讯 > 后端开发 > Python >JavaFilter过滤器的使用教程
  • 691
分享到

JavaFilter过滤器的使用教程

JavaFilter过滤器原理JavaFilter过滤器作用 2023-01-13 12:01:50 691人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、过滤器的使用以及实现原理当前的oa项目还存在什么缺陷Filter作用与执行原理过滤器怎么写过滤器的调用顺序Filter的生命周期二、责任链设计模式改造oa项目一、过滤器的使用

一、过滤器的使用以及实现原理

当前的oa项目还存在什么缺陷

①对于DeptServlet、EmpServlet、OrderServlet,每一个Servlet都是处理自己相关的业务;在这些Servlet执行之前都是需要判断用户是否登录了。如果用户登录了,可以继续操作,如果没有登录,需要用户登录。

②这段判断用户是否登录的代码是固定的,并且在每一个Servlet类当中都需要编写,显然代码没有得到重复利用。包括每一个Servlet都要解决中文乱码问题,也有公共的代码。这些代码目前都是重复编写,并没有达到复用。

③怎么解决这个问题?

可以使用Servlet规范中的Filter过滤器来解决这个问题。

Filter作用与执行原理

①Filter是过滤器。

②Filter可以在Servlet这个目标程序执行之前添加代码,也可以在目标Servlet执行之后添加代码;之前之后都可以添加过滤规则!

③一般情况下,都是在过滤器当中编写公共代码。

过滤器怎么写

(1)编写一个Java类实现javax.servlet.Filter接口,并且实现这个接口当中所有的方法;有三个方法:

①init方法:在Filter对象第一次被创建之后调用,并且只调用一次。

②doFilter方法:只要用户发送一次请求,则执行一次;发送N次请求,则执行N次。在这个方法中编写过滤规则!

③destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。

package com.bjpowernode.javaweb.servlet;
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    public MyFilter() {
        System.out.println("无参数构造方法执行");
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init方法执行");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Filter1 doFilter方法开始执行");
    }
    @Override
    public void destroy() {
        System.out.println("destroy方法执行");
    }
}

(2)在WEB.xml文件中对Filter进行配置,这个配置和Servlet很像。

或者使用注解:@WebFilter({"*.do"})

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="Http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>myfilter</filter-name>
        <filter-class>com.bjpowernode.javaweb.servlet.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myfilter</filter-name>
        <url-pattern>/a.do</url-pattern>
    </filter-mapping>
</web-app>

(3)打开服务器,无参构造方法和init方法都会执行;访问时doFilter方法才会执行。

①Servlet对象默认情况下,在服务器启动的时候是不会新建对象的。

②Filter对象默认情况下,在服务器启动的时候会新建对象,执行无参构造方法。

③Servlet是单例的,Filter也是单例的。

(4)编写两个类AServlet和BServlet继承httpservlet,并且AServlet路径定义为/a.do(和上面一样),BServlet路径定义为/b.do

package com.bjpowernode.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/a.do")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("AServlet中的doGet方法执行了。");
    }
}

BServlet类

package com.bjpowernode.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/b.do")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("BServlet中的doGet方法执行了。");
    }
}

发送请求:http://localhost:8080/servlet14/a.do发现只有过滤器MyFilter类中的doFilter方法执行了;而AServlet中的方法并没有执行:

(5)按理说我们发送http://localhost:8080/servlet14/a.doAservlet和MyFilter都会执行,因为路径都是/a.do ;实际上目标Servlet(Aservlet)是否执行,取决于两个条件:

①第一:在过滤器当中是否编写了:chain.doFilter(request, response); 代码。

②第二:用户发送的请求路径是否和Servlet的请求路径一致。

注意:chain.doFilter(request, response); 这行代码的作用:执行下一个过滤器,如果下面没有过滤器了,执行最终的Servlet。

注意:Filter的优先级,天生的就比Servlet优先级高。/a.do 对应一个Filter,也对应一个Servlet。那么一定是先执行Filter,然后再执行Servlet!

所以不妨重写一下doFilter方法,然后再次去访问:

package com.bjpowernode.javaweb.servlet;
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    public MyFilter() {
        System.out.println("无参数构造方法执行");
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init方法执行");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 在请求的时候添加过滤规则。
        System.out.println("Filter1 doFilter方法开始执行");
        // 执行下一个过滤器,如果下一个不是过滤器了,则执行目标程序Servlet
        // 简单理解就是向下走
        chain.doFilter(request,response);
        // 在响应的时候添加过滤规则。
        System.out.println("Filter1 doFilter方法执行结束。");
    }
    @Override
    public void destroy() {
        System.out.println("destroy方法执行");
    }
}

执行结果如下:

三句话都执行了,所以现在对于上面那个图就更加容易理解了:

①发送请求的时候,经过了过滤器;

②执行chain.doFilter(request, response); 执行下一个过滤器或者Servlet;

③进行响应也会经过过滤器;

补充:

①@WebFilter("/a.do") 精确匹配,只有发送a.do才会经过这个过滤器。

②@WebFilter({"/a.do", "/b.do"}) 匹配一个数组,发送a.do和b.do都可以经过这个过滤器。

③@WebFilter("*.do") 模糊匹配中的扩展匹配。以星号开始,注意这种路径不要以/开始。

④@WebFilter("/dept public class LoginFilter implements Filter { // 也可以只重写其中一个方法 @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { // 注意这里要先进行强转为HttpServlet,后面才能调用对应的方法 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse) resp; // 获取请求路径 String servletPath = request.getServletPath(); // 获取当前session对象,获取不到就返回null HttpSession session = request.getSession(false); if("/index.jsp".equals(servletPath) || "/welcome".equals(servletPath) || "/dept/login".equals(servletPath) || "/dept/exit".equals(servletPath) || (session != null && session.getAttribute("username") != null)){ // 经过上面过滤,只有上面的路径才会直接通过;其它的操作都要先跳转到登录页面 // 继续往下走 chain.doFilter(request, response); }else{ response.sendRedirect(request.getContextPath() + "/index.jsp"); } } }

这个过滤器写好以后,以后其它类也可以调用这个过滤器,都不用验证登录了;例如:一个员工的Servlet(EmpServlet)

package com.bjpowernode.oa.web.action;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;

public class EmpServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 乱码问题也可以写入过滤器当中
        // post请求乱码问题
        request.setCharacterEncoding("UTF-8");
        // 响应中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session = request.getSession(false);
        if(session != null && session.getAttribute("username") != null){
            String servletPath = request.getServletPath();
            //...
        }else{
            response.sendRedirect(request.getContextPath() + "/index.jsp");
        }
    }
}

对于原来的DeptServlet类也可以进行修改了:

        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute("username") != null){ // session对象不一定为null
            // 获取servlet path
            String servletPath = request.getServletPath();
            if ("/dept/list".equals(servletPath)){
                doList(request,response);
            }else if("/dept/detail".equals(servletPath)){
                doDetail(request,response);
            }else if("/dept/delete".equals(servletPath)) {
                doDel(request, response);
            }else if("/dept/add".equals(servletPath)) {
                doAdd(request, response);
            }else if("/dept/modify".equals(servletPath)) {
                doModify(request, response);
            }
        }else{
            // 跳转到登录页面
            response.sendRedirect(request.getContextPath()+"/index.jsp");
        }

修改为:

        String servletPath = request.getServletPath();
        if ("/dept/list".equals(servletPath)){
            doList(request,response);
        }else if("/dept/detail".equals(servletPath)){
            doDetail(request,response);
        }else if("/dept/delete".equals(servletPath)) {
            doDel(request, response);
        }else if("/dept/add".equals(servletPath)) {
            doAdd(request, response);
        }else if("/dept/modify".equals(servletPath)) {
            doModify(request, response);
        }

到此这篇关于Java Filter过滤器的使用教程的文章就介绍到这了,更多相关Java Filter过滤器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaFilter过滤器的使用教程

本文链接: https://lsjlt.com/news/177633.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaFilter过滤器的使用教程
    目录一、过滤器的使用以及实现原理当前的oa项目还存在什么缺陷Filter作用与执行原理过滤器怎么写过滤器的调用顺序Filter的生命周期二、责任链设计模式改造oa项目一、过滤器的使用...
    99+
    2023-01-13
    Java Filter过滤器原理 Java Filter过滤器作用
  • Java过滤器Filter的基本使用教程
    过滤器Filter 用于拦截请求、过滤响应在不使用过滤器时,浏览器向服务器发送请求后,服务器将会直接去获取资源并响应给浏览器添加Filter后,浏览器向服务器发送请求,请求在到达服务...
    99+
    2023-02-22
    Java Filter Java Filter过滤器 Java过滤器
  • Java过滤器Filter如何使用教程
    这篇“Java过滤器Filter如何使用教程”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java过滤器Filter如何使用...
    99+
    2023-07-05
  • SpringBoot过滤器的使用
    目录一、什么是过滤器二、过滤器的使用三、测试结果一、什么是过滤器 过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆...
    99+
    2024-04-02
  • springboot使用过滤器
    一:过滤器 1.过滤器介绍 过滤器是处于客户端与服务器资源文件之间的一道过滤网,帮助我们过滤一些不符合要求的请求。通常用作 Session校验,判断用户权限。 2.过滤器生命周期 使用过滤器很简单,只需要实现Filter类,然后重写它的3个...
    99+
    2023-09-03
    servlet java 开发语言 spring boot
  • jQuery如何使用过滤器过滤多属性
    这篇文章给大家分享的是有关jQuery如何使用过滤器过滤多属性的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用过滤器过滤多属性//This precision-based approache...
    99+
    2023-06-27
  • JavaSpringBoot使用guava过滤器
    目录介绍特点数据结构新增数据查询数据删除数据作用业务使用快速开始介绍 布隆过滤器(BloomFilter)是一种数据结构,特点是高效地插入和查询,可以用来告诉你某个key一定不存在或...
    99+
    2024-04-02
  • Shell过滤器的具体使用
    我们己经知道,将几个命令通过管道符组合在一起就形成一个管道。通常,通过这种方式使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后将其输出。 简单地说,过滤器可以概括为以下两点: 如果一个 l...
    99+
    2022-06-04
    Shell过滤器
  • VUE过滤器的使用方法
    这篇文章主要讲解了“VUE过滤器的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VUE过滤器的使用方法”吧!1. 定义一个日期格式化函数都9012了...
    99+
    2024-04-02
  • Vue.js的过滤器怎么使用
    这篇文章主要介绍了Vue.js的过滤器怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue.js的过滤器怎么使用文章都会有所收获,下面我们一起来看看吧。一、过滤器作用过滤器用于进行文本内容格式化处理。二...
    99+
    2023-06-29
  • SpringBootFilter过滤器的使用方式
    前言: 要想使用 filter,需要写一个方法继承 Filter 类,我们写如下两个自己的 Filter 类,首先是 FirstFilter 类,其中 ...
    99+
    2024-04-02
  • vue全局过滤器怎么设置(教程)
    Vue.js 是一个高效、灵活并且易于学习的前端框架,具有响应式和组件化的特性。Vue.js 还提供了一种很便捷的方式来处理数据,那就是 Vue.js 的过滤器。在 Vue.js 中,过滤器可以用于转换数据。通常我们要将数据进行格式化以满足...
    99+
    2023-05-14
  • springboot中使用过滤器,jsoup过滤XSS脚本详解
    目录springboot使用过滤器,jsoup过滤XSS脚本1.把可能包含脚本的参数位置分析一下2.分析实现过程3.代码实现过程使用jsoup防止XSS攻击springboot使用过...
    99+
    2024-04-02
  • AngularJS怎么使用过滤器
    这篇文章给大家分享的是有关AngularJS怎么使用过滤器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、为什么使用过滤器? 在实际操作中,我们需要对统一数据源进行多次转换,比...
    99+
    2024-04-02
  • vue如何使用过滤器
    在vue中使用过滤器的方法:1.新建vue.js项目;2.使用import方法引入filter过滤器;3.全局注册过滤器;4.执行命令直接引用;具体步骤如下:首先,在vue-cli中创建一个vue.js项目;vue create proje...
    99+
    2024-04-02
  • Shell过滤器怎么使用
    这篇文章主要介绍“Shell过滤器怎么使用”,在日常操作中,相信很多人在Shell过滤器怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Shell过滤器怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-09
  • Vue的filters过滤器怎么使用
    本篇内容主要讲解“Vue的filters过滤器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue的filters过滤器怎么使用”吧!1、示例代码采用vue单文件组件,使用moment插...
    99+
    2023-07-04
  • Vue.js中如何使用过滤器
    Vue.js中如何使用过滤器,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。过滤器是一个通过输入数据,能够及时对数据进行处理并返...
    99+
    2024-04-02
  • 如何使用vue过滤器filter
    目录概述定义过滤器过滤器的使用自定义全局过滤器局部过滤器注意事项示例一(局部过滤器)示例二(全局过滤器)概述 在 vue2.0 之前,是有内置过滤器的,在2.0中已经没有内置的过滤器...
    99+
    2024-04-02
  • springbootwebflux过滤器(使用RouterFunction实现)
    目录webflux过滤器(RouterFunction实现)相关类与接口示例使用测试RouterFunction的webflux代码接下来看看routerFunction下的参数校验...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作