过滤器知识

127 阅读1分钟

web.xml 在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。 web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter。 当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。 在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

<?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">
    <welcome-file-list>
        <welcome-file>ip</welcome-file>
    </welcome-file-list>
    <filter>
    <!-- filter名可以随便起,但要与下面的mapping中的filter-name保持一致 -->
        <filter-name>ip_filter</filter-name>
 <!-- 实现类所在目录 -->
        <filter-class>IpFilter</filter-class>
    </filter>
    <filter-mapping>
   <!-- 对应的filter名,和上边的filter名保持一致保持映射关系 -->
        <filter-name>ip_filter</filter-name>
      <!-- 要进行拦截过滤的目录 /*代表拦截全部。或者输入具体需要拦截的目录名-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>ipServlet</servlet-name>
        <servlet-class>IpServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ipServlet</servlet-name>
        <url-pattern>/ip</url-pattern>
    </servlet-mapping>
</web-app>

@WebFilter的配置
在以后的高版本的web项目中,不需要再对xml进行配置了,只需要写一个普通的java类实现Filter接口,对该类进行@WebFilter说明就可以。下面说一下如何对@WebFilter配置。
@WebFilter的常用属性

图片.png

package com.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharsetFilet implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
```
```
应用场景:
- 设置登陆权限验证
- 中文乱码问题