08.Filter

本文介绍了JavaWeb的Filter过滤器,作为三大组件之一,它能拦截Web资源并进行处理。详细阐述了Filter的执行流程,包括init(), destroy()和doFilter()方法。通过示例代码展示了Filter的创建和使用,以及如何配置Filter来拦截转发请求。最后,讨论了Filter在解决全局乱码问题中的应用。" 110237421,9124535,Postman处理Cookie解析与传递,"['接口测试', 'Postman']

Filter概述

过滤器Filter是 JavaWeb三大组件(Servlet Filter Listener)之一,它能够对Web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理。

Filter执行流程

在这里插入图片描述

Filter的使用

使用Filter需要创建一个类,实现javax.servlet.Filter接口,并重写里面所有方法
在这里插入图片描述
init():服务器启动时,就会创建该Filter,并会执行init方法,进行初始化。
destory():服务器关闭,过滤器被销毁时会执行的方法。
doFilter():该方法是过滤器的核心方法,用户的请求会进入该方法,我们可以编写代码逻辑进行请求的过滤,如果允许请求通过,执行 chain.doFilter(req, resp),该方法会给请求放行,过滤器接收到返回结果后,会执行chain.doFilter()方法之后的代码。
在这里插入图片描述
如果不允许通过,不写 chain.doFilter(req, resp)即可,执行执行完当前方法后便会自动返回给前台。

代码示例:
定义一个Serlvet,请求路径为/MyServlet

@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        System.out.println("MyServlet执行!!");
    }
    protected void  doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doPost(request,response);
    }
}

定义一个Filter:
@WebFilter 注解,filterName属性定义了该Filter的名称,value属性定义了该Filter的拦截路径

@WebFilter(filterName = "MyFilter",value = "/MyServlet")
public class LoginFilter implements javax.servlet.Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("逻辑代码1");
        chain.doFilter(req, resp);
        System.out.println("逻辑代码2");
    }
    public void init(FilterConfig config) throws ServletException {

    }

}

# 多个Filter的执行顺序
如果有一条路径被多个过滤器拦截,那么多个过滤器的执行顺序是什么呢?
1:注解配置
当有多个过滤器时,是按照过滤器类的首字母的先后顺序执行
如果AFilter,BFilter都拦截同一条路径,先过滤AFilter,后执行BFilter。
2:web.xml配置
当有多个过滤器时,是按照web.xml中 < filter-mapping>配置的先后先后顺序执行的,以下 的执行顺序为MyServlet---->MyServlet2
```java
 <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.lg.filter.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    
     <servlet>
        <servlet-name>MyServlet2</servlet-name>
        <servlet-class>com.lg.filter.MyServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

Filter拦截转发请求

默认情况下,过滤器只能拦截直接访问的资源,不能拦截转发访问的资源.如果想让过滤器拦截转发的资源,需要修改@WebFilter中DispatcherType属性.
DispatcherType:
REQUEST:默认值,代表直接访问某个资源时执行filter
FORWARD:转发时才执行filter。

@WebFilter(value = "/login",dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})

Filter的应用-全局乱码解决

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1:解决请求参数乱码
        HttpServletRequest request = (HttpServletRequest)req;
        String method = request.getMethod();
        if(method.equals("POST")) {
            req.setCharacterEncoding("UTF-8");
        }
        resp.setContentType("text/html;charset=UTF-8");
        chain.doFilter(req, resp);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值