广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >[Java]过滤器(Filter)
  • 783
分享到

[Java]过滤器(Filter)

servletjava开发语言 2023-08-31 09:08:31 783人浏览 独家记忆
摘要

一、什么是过滤器 过滤器是Servlet的高级特性之一,是实现Filter接口的Java类! 过滤器的执行流程:   从上面的图我们可以发现,当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web的资源。服务器响应Response

一、什么是过滤器

过滤器是Servlet的高级特性之一,是实现Filter接口的Java类!
过滤器的执行流程:

 

从上面的图我们可以发现,当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web的资源。服务器响应Response,从Web资源抵达浏览器之前,也会途径过滤器。

过滤器的用途:过滤一些敏感的字符串【规定不能出现敏感字符串】、避免中文乱码【规定WEB资源都使用UTF-8编码】、权限验证【规定只有带Session或Cookie的浏览器,才能访问web资源】等等等。

也就是说:当需要限制用户访问某些资源时、在处理请求时提前处理某些资源、服务器响应的内容对其进行处理再返回、我们就是用过滤器来完成的!

二、过滤器的一般用途

解决中文乱码问题

只要在过滤器中指定了编码,可以使全站的Web资源都是使用该编码,并且重用性是非常理想的!

public class CharacterEncodingFilter implements Filter {    @Override    public void destroy() {        // TODO Auto-generated method stub    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        request.setCharacterEncoding("utf-8");        chain.doFilter(request, response);    }    @Override    public void init(FilterConfig arg0) throws ServletException {        // TODO Auto-generated method stub    }}

web.xml配置:

    CharacterEncodingFilter  com.entor.filter.CharacterEncodingFilter   CharacterEncodingFilter  /*

过滤器 api

只要Java类实现了Filter接口就可以称为过滤器!Filter接口的方法也十分简单:

其中init()和destory()方法就不用多说了,他俩跟Servlet是一样的。只有在Web服务器加载和销毁的时候被执行,只会被执行一次!

值得注意的是doFilter()方法,它有三个参数(ServletRequest,ServletResponse,FilterChain),从前两个参数我们可以发现:过滤器可以完成任何协议的过滤操作!

FilterChain是一个接口,里面又定义了doFilter()方法。这究竟是怎么回事啊??????

我们可以这样理解:过滤器不单单只有一个,那么我们怎么管理这些过滤器呢?在Java中就使用了链式结构。把所有的过滤器都放在FilterChain里边,如果符合条件,就执行下一个过滤器(如果没有过滤器了,就执行目标资源)。

上面的话好像有点拗口,我们可以想象生活的例子:现在我想在茶杯上能过滤出石头和茶叶出来。石头在一层,茶叶在一层。所以茶杯的过滤装置应该有两层滤网。这个过滤装置就是FilterChain,过滤石头的滤网和过滤茶叶的滤网就是Filter。在石头滤网中,茶叶是属于下一层的,就把茶叶放行,让茶叶的滤网过滤茶叶。过滤完茶叶了,剩下的就是茶(茶就可以比喻成我们的目标资源)

三、快速入门

写一个简单的过滤器
实现Filter接口的Java类就被称作为过滤器

    public class FilterDemo1 implements Filter {        public void destroy() {        }        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {            //执行这一句,说明放行(让下一个过滤器执行,如果没有过滤器了,就执行执行目标资源)            chain.doFilter(req, resp);        }        public void init(FilterConfig config) throws ServletException {        }    }

filter部署

过滤器和Servlet是一样的,需要部署到Web服务器上的。

  • 第一种方式:在web.xml文件中配置
                FilterDemo1             FilterDemo1                          Word_file              /WEB-INF/word.txt                            FilterDemo1        /*    

用于注册过滤器

  • 用于为过滤器指定一个名字,该元素的内容不能为空。
  • 元素用于指定过滤器的完整的限定类名。
  • 元素用于为过滤器指定初始化参数,它的子元素

元素用于设置一个Filter 所负责拦截的资源。

  • 子元素用于设置filter的注册名称。该值必须存在
  • 设置 filter 所拦截的请求路径(过滤器关联的URL样式)
  • 第二种方式:通过注解配置
//@Component//无需添加此注解,在启动类添加@ServletComponentScan注解后,会自动将带有@WebFilter的注解进行注入!@WebFilter(urlPatterns = "/lvjia/carbodyad/api/*", filterName = "rest0PubFilter")@Order(1)//指定过滤器的执行顺序,值越大越靠后执行public class Rest0PubFilter implements Filter {      @Override    public void init(FilterConfig filterConfig) {//初始化过滤器         System.out.println("getFilterName:"+filterConfig.getFilterName());//返回元素的设置值。         System.out.println("getServletContext:"+filterConfig.getServletContext());//返回FilterConfig对象中所包装的ServletContext对象的引用。         System.out.println("getInitParameter:"+filterConfig.getInitParameter("cacheTimeout"));//用于返回在web.xml文件中为Filter所设置的某个名称的初始化的参数值         System.out.println("getInitParameterNames:"+filterConfig.getInitParameterNames());//返回一个Enumeration集合对象。    }     @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,                      FilterChain filterChain) throws IOException, ServletException {         if(false){             response.sendRedirect("Http://localhost:8081/demo/test/login");//重定向         }         filterChain.doFilter(servletRequest, servletResponse);//doFilter将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源  }     @Override    public void destroy() {    } }
@SpringBootApplication@ServletComponentScan   //Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。public class Application {    public static void main(String[] args) {        springApplication.run(Application.class, args);    }}

 

@WebFilter常用属性

属性类型是否必需说明
asyncSupportedboolean指定Filter是否支持异步模式
dispatcherTypesDispatcherType[]指定Filter对哪种方式的请求进行过滤。支持的属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST;默认过滤所有方式的请求
filterNameStringFilter名称
initParamsWebInitParam[]配置参数
displayNameStringFilter显示名
servletNamesString[]指定对哪些Servlet进行过滤
urlPatterns/valueString[]两个属性作用相同,指定拦截的路径

过滤器的urlPatterns的过滤路径规则:

  • 全路径匹配: /abc/myServlet1.do
  • 部分路径匹配: /abc/*
  • 通配符匹配 :/*
  • 后缀名匹配 :*.do (注意:前面不加/)

过滤器的执行顺序

上面已经说过了,过滤器的doFilter()方法是极其重要的,FilterChain接口是代表着所有的Filter,FilterChain中的doFilter()方法决定着是否放行下一个过滤器执行(如果没有过滤器了,就执行目标资源)。

四、Filter简单应用

filter的三种典型应用:

  • 可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法,即是否让目标资源执行
  • 在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行
  • 在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能

禁止浏览器缓存所有动态页面

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {        //让Web资源不缓存,很简单,设置http中response的请求头即可了!        //我们使用的是http协议,ServletResponse并没有能够设置请求头的方法,所以要强转成httpservletRequest        //一般我们写Filter都会把他俩强转成Http类型的        HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) resp;        response.setDateHeader("Expires", -1);        response.setHeader("Cache-Control", "no-cache");        response.setHeader("Pragma", "no-cache");        //放行目标资源的response已经设置成不缓存的了        chain.doFilter(request, response);    }
  • 没有过滤之前,响应头是这样的:

     
  • 过滤之后,响应头是这样的:

     

实现自动登陆

  • 实体:
 private String username ;    private String password;    public User() {    }    public User(String username, String password) {        this.username = username;        this.password = password;    }    //各种setter和getter
   public class UserDB {        private static List users = new ArrayList<>();        static {            users.add(new User("aaa", "123"));            users.add(new User("bbb", "123"));            users.add(new User("ccc", "123"));        }        public static List getUsers() {            return users;        }        public static void setUsers(List users) {            UserDB.users = users;        }    }
 public User find(String username, String password) {        List userList = UserDB.getUsers();        //遍历List集合,看看有没有对应的username和password        for (User user : userList) {            if (user.getUsername().equals(username) && user.getPassword().equals(password)) {                return user;            }        }        return null;    }
  • 登陆界面
用户名
密码
10分钟 30分钟 1小时
  • 处理登陆的Servlet
    //得到客户端发送过来的数据        String username = request.getParameter("username");        String password = request.getParameter("password");        UserDao userDao = new UserDao();        User user = userDao.find(username, password);        if (user == null) {            request.setAttribute("message", "用户名或密码是错的!");            request.getRequestDispatcher("/message.jsp").forward(request, response);        }        //如果不是为空,那么在session中保存一个属性        request.getSession().setAttribute("user", user);        request.setAttribute("message", "恭喜你,已经登陆了!");        //如果想要用户关闭了浏览器,还能登陆,就必须要用到Cookie技术了        Cookie cookie = new Cookie("autoLogin", user.getUsername() + "." + user.getPassword());        //设置Cookie的最大声明周期为用户指定的        cookie.setMaxAge(Integer.parseInt(request.getParameter("time")) * 60);        //把Cookie返回给浏览器        response.addCookie(cookie);        //跳转到提示页面        request.getRequestDispatcher("/message.jsp").forward(request, response);
  • 过滤器
       HttpServletResponse response = (HttpServletResponse) resp;        HttpServletRequest request = (HttpServletRequest) req;        //如果用户没有关闭浏览器,就不需要Cookie做拼接登陆了        if (request.getSession().getAttribute("user") != null) {            chain.doFilter(request, response);            return;        }        //用户关闭了浏览器,session的值就获取不到了。所以要通过Cookie来自动登陆        Cookie[] cookies = request.getCookies();        String value = null;        for (int i = 0; cookies != null && i < cookies.length; i++) {            if (cookies[i].getName().equals("autoLogin")) {                value = cookies[i].getValue();            }        }        //得到Cookie的用户名和密码        if (value != null) {            String username = value.split("\\.")[0];            String password = value.split("\\.")[1];            UserDao userDao = new UserDao();            User user = userDao.find(username, password);            if (user != null) {                request.getSession().setAttribute("user", user);            }        }        chain.doFilter(request, response);
  • 效果:

来源地址:https://blog.csdn.net/m0_71229255/article/details/130246404

--结束END--

本文标题: [Java]过滤器(Filter)

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • [Java]过滤器(Filter)
    一、什么是过滤器 过滤器是Servlet的高级特性之一,是实现Filter接口的Java类! 过滤器的执行流程:   从上面的图我们可以发现,当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web的资源。服务器响应Response...
    99+
    2023-08-31
    servlet java 开发语言
  • java过滤器(Filter)
    原文链接:java过滤器(Filter – 编程屋 目录 1 过滤器简介 2 Filter详细介绍 3 Filter的用法 3.1 用法1  3.2 用法2 1 过滤器简介 filter也称之为过滤器,它是javaWeb三大组件之一(S...
    99+
    2023-09-07
    servlet
  • java过滤器中Filter的ChainFilter过滤链
    在Java过滤器中,FilterChain是一种过滤链,用于按照一定顺序依次调用多个过滤器对请求进行处理。FilterChain接口定义了一个doFilter方法,该方法接受ServletRequest和ServletResponse作...
    99+
    2023-08-11
    java
  • Java过滤器Filter详解
    目录Filter学习Filter功能Filter的工作原理多个Filter的实现Filter的执行逻辑总结Filter学习 Filter功能 拦截jsp、静态图片文件、静态html资源文件 实现URL级别的权限访问控制 ...
    99+
    2019-04-25
    Java过滤器 Filter
  • java filter过滤器怎么使用
    在 Java 中使用过滤器(Filter)需要以下步骤:1. 创建一个类并实现 javax.servlet.Filter 接口。该接...
    99+
    2023-09-06
    java filter
  • HBase Filter 过滤器概述
    abc 过滤器介绍 HBase过滤器是一套为完成一些较高级的需求所提供的API接口。 过滤器也被称为下推判断器(push-down predicates),支持把数据过滤标准从客户端下推到服务器,带有 Filter 条件的 RPC...
    99+
    2019-09-14
    HBase Filter 过滤器概述
  • ASP.NET Core MVC 过滤器(Filter)
    目录一.过滤器如何工作1.选择过滤器2.实现过滤器3.过滤器作用域 4.取消和短路二.配置过滤器1.依赖注入2.排序 3.对比中间件一.过滤器如何工作   不同的...
    99+
    2022-11-12
  • Java中使用Filter过滤器的方法
    Filter过滤器 着重记录下 public void doFilter(){} 方法参数: (1) ServletRequest servletRequest  请求re...
    99+
    2022-11-12
  • Java过滤器Filter如何使用教程
    这篇“Java过滤器Filter如何使用教程”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java过滤器Filter如何使用...
    99+
    2023-07-05
  • java中filter过滤器的作用有哪些
    在Java中,filter过滤器主要用于对集合或流中的元素进行条件过滤,只保留满足特定条件的元素。它的主要作用包括: 过滤元素:...
    99+
    2023-10-24
    java filter
  • java中filter过滤器的用法是什么
    在Java中,过滤器(Filter)是一种用于在请求到达目标资源之前或之后执行某些操作的组件。过滤器可以用于实现对请求的拦截、修改或...
    99+
    2023-10-11
    java
  • Java过滤器Filter的基本使用教程
    过滤器Filter 用于拦截请求、过滤响应在不使用过滤器时,浏览器向服务器发送请求后,服务器将会直接去获取资源并响应给浏览器添加Filter后,浏览器向服务器发送请求,请求在到达服务...
    99+
    2023-02-22
    Java Filter Java Filter过滤器 Java过滤器
  • 详解Servlet之过滤器(Filter)
    过滤器1.为什么使用它?有很多全站性的东西需要处理,例如乱码问题,通过过滤器统一进行过滤更简单2.有什么用?实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以...
    99+
    2023-05-31
    servlet 过滤器 滤器
  • servlet过滤器(Filter)详解(九)
    本文实例为大家分享了servlet过滤器的具体代码,供大家参考,具体内容如下1.servlet过滤器产生背景  项目中我们会遇到这样一类的需求,对访问服务器的用户ip实施过滤,只有在允许名单中的ip才能访问服务,为了实现需求,每当有客户端请...
    99+
    2023-05-31
    servlet 过滤器 filter
  • filter过滤器怎么在Java项目中使用
    这篇文章将为大家详细讲解有关filter过滤器怎么在Java项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Filter过滤器技术。通过过滤器,可以对来自客户端的请求进行拦截,进行预...
    99+
    2023-05-31
    java ava filter
  • Java中过滤器 (Filter) 和 拦截器 (Interceptor)的使用
    目录1.过滤器 (Filter)2.拦截器 (Interceptor)3.区别3.11、实现原理不同3.2 使用范围不同3.3 触发时机不同3.4 拦截的请求范围不同3.5 注入Be...
    99+
    2022-11-12
  • 一文详解JavaWeb过滤器(Filter)
    目录基本介绍过滤器(Filter)接口使用过滤器(Filter)创建过滤器(Fliter)使用过滤器(Filter)配置过滤器(Filter)拦截路径 注解方式xml方式&...
    99+
    2023-05-19
    Java 过滤器 Java Filter
  • HBase Filter 过滤器之RowFilter详解
    前言:本文详细介绍了HBase RowFilter过滤器Java&Shell API的使用,并贴出了相关示例代码以供参考。RowFilter 基于行键进行过滤,在工作中涉及到需要通过HBase Rowkey进行数据过滤时可以考虑使...
    99+
    2017-12-16
    HBase Filter 过滤器之RowFilter详解
  • HBase Filter 过滤器之FamilyFilter详解
    前言:本文详细介绍了 HBase FamilyFilter 过滤器 Java&Shell API 的使用,并贴出了相关示例代码以供参考。FamilyFilter 基于列族进行过滤,在工作中涉及到需要通过HBase 列族进行数据过滤...
    99+
    2017-01-24
    HBase Filter 过滤器之FamilyFilter详解
  • HBase Filter 过滤器之QualifierFilter详解
    前言:本文详细介绍了 HBase QualifierFilter 过滤器 Java&Shell API 的使用,并贴出了相关示例代码以供参考。QualifierFilter 基于列名进行过滤,在工作中涉及到需要通过HBase 列名...
    99+
    2014-11-14
    HBase Filter 过滤器之QualifierFilter详解
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作