servlet中的Filter接口(过滤器接口)

简介: servlet中的Filter接口(过滤器接口)

一.介绍

(1)来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包


2.png


(2)Filter接口实现类由开发人员负责提供,Http服务器不负责提供


(3)  Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截


二.具体作用

1.拦截Http服务器,帮助Http服务器检测当前请求合法性.


2.拦截Http服务器,对当前请求进行增强操作.


三.Filter接口实现类开发步骤

其开发步骤一共有三步:


(1)创建一个Java类实现Filter接口


(2)重写Filter接口中doFilter方法,完成我们具体想要实现的功能。


(3)web.xml将过滤器接口实现类注册到Http服务器(此处我们是tomcat),并且可以设置去通知我们的Tomcat在调用何种资源文件前需要使用我们的过滤器类进行拦截。


四.Filter拦截地址格式

(1) 命令格式:


首先将我们的的Filter接口实现类注册到我们的tomcat容器

         <!--将过滤器类文件路径交给Tomcat-->
          <filter>
              <filter-name>oneFilter</filter-name>
              <filter-class>com.bjpowernode.filter.OneFilter</filter-class>
          </filter>
          <!--通知Tomcat在调用何种资源文件时需要被当前过滤器拦截-->
          <filter-mapping>
              <filter-name>oneFilter</filter-name>
              <url-pattern>想要拦截的路径</url-pattern>
          </filter-mapping>

首先使用filter将我们的过滤器接口实现类注册到我们的tomcat,然后此时再使用filter-mapping来指定我们注册到tomcat的过滤器类需要拦截哪个资源文件。


(2)下面我们来介绍下 <url-pattern>中可以放入哪些拦截路径,假设此时我们设置的过滤器类为OneFilter


要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截

                      <url-pattern>/img/mm.jpg</url-pattern>


要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截

                       <url-pattern>/img/*</url-pattern>


要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截

                       <url-pattern>*.jpg</url-pattern>


要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截

                       <url-pattern>/*</url-pattern>


要求Tomcat在调用网站中的某个动态资源文件(servlet实现类)时,来调用OneFilter拦截


                         <url-pattern>/请求资源别名</url-pattern>  注意:此处的请求资源别名指的是我们在web.xml所设置的访问我们某个servlet实现类时候的请求别名。



当我们在网站中输入      http://localhost:8080/网站名/想要拦截的资源文件/    这个路径的时候便会先进行拦截,然后再去访问我们的资源文件。


五.代码实现

代码逻辑:当用户在前台进行登录的时候,会输入自己的姓名密码,点击提交后,此时需要一个Filter接口实现类来验证我们输入的姓名密码是否与我们之前注册的账号和密码相同,如果相同的话,此时再继续访问我们点击提交后想要访问的地址,假设此时点击提交后浏览器的访问地址为http://localhost:8080/myweb/one


1:首先我们先编写一个前端页面:里面需要放入我们的登录页面的代码,在action中指定提交后我们想要访问的地址。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆界面</title>
</head>
<body>
<form action="/myweb/one">
    用户名称:<input type="text" name="username" />
    用户密码:<input type="password" name="password"/>
    提交按钮:<input type="submit" value="提交">
</form>
</body>
</html>


2:然后再写我们的Filter接口实现类:假设此时之前我们注册的姓名为王五,密码为123。

public class OneFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        String name=servletRequest.getParameter("username");
        String password=servletRequest.getParameter("password");
        if(name.equals("王五")&&password.equals("123")){
            //将拦截请求对象和响应对象交还给Tomcat,由Tomcat继续调用资源文件
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            servletResponse.setContentType("text/html;charset=utf-8");
            PrintWriter printWriter=servletResponse.getWriter();
            printWriter.print("请重新输入");
        }
    }
    @Override
    public void destroy() {
    }
}


注意事项:当if语句中我们校验成功后,需要将我们的拦截请求对象和响应对象交还给Tomcat,由Tomcat继续调用资源文件,所以此时需要我们的过滤器链条对象filterChain调用doFilter方法将拦截请求对象和响应对象交还给Tomcat,注意filterChain所调用的doFilter方法是它自己的,并不是Filter接口类中的doFilter方法,如下图所示:


2.png


我们一般将这个交还的动作称为放行。


如果前台用户输入的姓名和密码有误的话,就提醒用户重新输入,此时我们的过滤器代替Http服务器拒绝本次请求


3:编写完我们的过滤器接口实现类OneFilter后,再编写我们的OneServlet接口实现类,此类是当用户校验成功后,继续访问的动态资源文件。

public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name=req.getParameter("username");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter printWriter=resp.getWriter();
        printWriter.print("用户的姓名为"+name);
        System.out.println();
        printWriter.print("用户的密码输入正确");
        printWriter.flush();
    }
}

此处就假设当用户通过校验后,显示姓名和密码正确即可。


4:最后在web.xml文件中进行我们的配置

<?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>onefilter</filter-name>
        <filter-class>com.bjpowernode.Filter.OneFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>onefilter</filter-name>
        <url-pattern>/one</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
</web-app>

注意事项:<filer-mapping>中的<url-pattern>处填写的应该是我们想要拦截的资源路径,因为我们是想在访问OneServlet的时候进行一个校验,所以此处就填写我们的请求别名/one即可。


相关文章
|
前端开发 JavaScript Java
Web.xml - Servlet与Filter的url-pattern
Web.xml - Servlet与Filter的url-pattern
137 8
|
4月前
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
7月前
|
NoSQL Java Redis
深入理解Servlet Filter及其限流实践
深入理解Servlet Filter及其限流实践
179 44
|
5月前
|
存储 前端开发 Java
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
该文章展示了如何使用Servlet过滤器(Filter)通过注解方式创建一个网站访问人数统计功能,通过`@WebFilter`注解定义过滤器及其URL模式,并在`doFilter`方法中实现计数逻辑,将访问次数存储在`ServletContext`中,最后在JSP页面展示访问人数。
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
|
5月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
267 0
|
5月前
|
监控 前端开发 Java
揭秘Web开发神器:Servlet、过滤器、拦截器、监听器如何联手打造无敌博客系统,让你的用户欲罢不能!
【8月更文挑战第24天】在Java Web开发中,Servlet、过滤器(Filter)、拦截器(Interceptor,特指Spring MVC中的)及监听器(Listener)协同工作,实现复杂应用逻辑。以博客系统为例,Servlet处理文章详情请求,过滤器(如LoginFilter)检查登录状态并重定向,Spring MVC拦截器(如LoggingInterceptor)提供细粒度控制(如日志记录),监听器(如SessionListener)监控会话生命周期事件。这些组件共同构建出高效、有序的Web应用程序。
42 0
|
8月前
|
容器
Servlet 教程 之 Servlet 编写过滤器 6
该教程介绍了如何在Servlet中编写过滤器。可以创建多个过滤器,如AuthenFilter和LogFilter,并通过不同的映射进行配置。过滤器的应用顺序由web.xml中filter-mapping的顺序决定,可通过调整顺序改变过滤器执行的先后。
37 3
|
8月前
|
Java 容器
Servlet 教程 之 Servlet 编写过滤器 2
Servlet过滤器教程:实现Filter接口,包含3个核心方法。1) doFilter用于实际过滤,处理匹配URL的请求,调用FilterChain处理后续过滤。2) init方法在应用启动时被调用,初始化filter,从FilterConfig获取配置信息。3) destroy方法在过滤器销毁前执行,释放资源。
41 2
|
8月前
|
Java
Servlet 教程 之 Servlet 编写过滤器 3
`LogFilter` 是一个 Servlet 过滤器示例,它打印网站名称并传递请求至过滤链。当与 `DisplayHeader` Servlet(显示 HTTP 头信息)配合使用时,提供基础过滤器概念的理解。过滤器在请求处理前可添加额外功能或修改输入,而 `doGet` 方法则用于响应 GET 请求,展示请求头信息。
27 2
|
8月前
|
XML 数据格式
Servlet 教程 之 Servlet 编写过滤器 4
在Servlet教程中,学习如何编写过滤器。在`web.xml`配置文件中,创建一个名为`LogFilter`的过滤器,类为`com.baidu.test.LogFilter`,设置初始化参数`Site`为`百度`。将过滤器映射到`/*`,确保所有请求都会经过此过滤器。同时定义了一个名为`DisplayHeader`的Servlet,映射到`/TomcatTest/DisplayHeader`路径。
31 1