1.先来看一张图
2.过滤器的功能:
①分析请求,将请求发送给指定的资源或自己创建一个响应返回
②在请求到达服务器前处理请求,设置头请求信息,将请求封装成符合规则的对象
3在响应到达客户端前处理响应,将响应封装成符合规则的对象
3.过滤器的用途
4.过滤器的执行
过滤器处理请求采取以下3种情况之一
①过滤器自身产生一个响应,返回给客户端
②把请求转发给过滤器链中的下一个过滤器,如果是最后一个过滤器则将请求转发给请求指定的资源
3把请求转发到另一资源
5.过滤器相关API
6.过滤器相关的接口
init()方法--Servlet容器最先调用过滤器的init()方法,初始化过滤器,生命周期中只调用一次
doFilter()方法--Servlet容器调用doFilter()方法处理请求
destroy()方法--Servlet容器最后调用destroy()方法,释放过滤器所占的资源
7.配置过滤器
8.Filter补充
①Filter配置过滤器链(按照在web.xml容器中配置的顺序依次执行,形成过滤器链)
②Servlet容器可以对同一个过滤器对象运行多个线程来同时处理多个请求
代码示例一
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_3_1.xsd"
version="3.1">
<filter>
<description>字符编码过滤器</description>
<filter-name>EncodingFilter</filter-name>
<filter-class>filter.EncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
EncodingFilter.java
package filter;
import javax.servlet.*;
import java.io.IOException;
public class EncodingFilter 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");
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest, servletResponse);//放行
}
@Override
public void destroy() {
}
}
示例代码二
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_3_1.xsd"
version="3.1">
<filter>
<description>登录认证过滤器</description>
<filter-name>LimitFilter</filter-name>
<filter-class>filter.LimitFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LimitFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
LimitFilter.java
package filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class LimitFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)servletRequest ;
User user=(User)req.getSession().getAttribute("user");
if(user!=null){
filterChain.doFilter(servletRequest, servletResponse);//放行
}else{
req.setAttribute("result", "您还没有登陆");
req.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}