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

本文详细讲解了Servlet规范下的Filter如何在Tomcat中拦截HTTP请求,验证用户登录信息,并展示了如何在web.xml中配置。通过实例说明了Filter的开发步骤和常见url-pattern应用。
摘要由CSDN通过智能技术生成

一.介绍

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

(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方法,如下图所示:

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

如果前台用户输入的姓名和密码有误的话,就提醒用户重新输入,此时我们的过滤器代替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即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值