文章目录
创建一个 Filter 类:
- 实现 Filer 接口:
public class HelloFilter implements Filter
- 在
web.xml
文件中配置并映射该Filter
。 - 其中
url-pattern
指定该Filter
可以拦截那些资源。
<!-- =========== Filter ================= -->
<!-- 注册Filter -->
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>com.edut.filter.HelloFilter</filter-class>
</filter>
<!-- 映射Filter -->
<filter-mapping>
<filter-name>helloFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
package com.edut.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloFilter implements Filter {
@Override
public void destroy() {
//Filter.super.destroy();
System.out.println("Filter destroy ...");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//这里不注释,filter启动会失败
//Filter.super.init(filterConfig);
System.out.println("Filter init ...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter doFilter ...");
}
}
Filter 顺序
<!-- =========== Filter ================= -->
<!-- 注册Filter -->
<filter>
<filter-name>secondFilter</filter-name>
<filter-class>com.edut.filter.SeconderFilter</filter-class>
</filter>
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>com.edut.filter.HelloFilter</filter-class>
</filter>
<!-- 映射Filter -->
<filter-mapping>
<filter-name>helloFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
<!-- 拦截 顺序 与 mapping 顺序有关 -->
<filter-mapping>
<filter-name>secondFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("seconder filter do filter .... ");
chain.doFilter(request, response); // <-----------注意加这个
}
Filter 相关的 API
public void init(FilterConfig filterConfig)
:类似于Servlet
的init
方法。
在创建Filter
对象(Filter对象立即被调用),而且只被调用一次 ⇒ <mark>单例</mark>。FilterConfig
类似于ServletConfig
- 可以在 web.xml 文件中配置。
public void doFilter(ServletRequest request , ServletResponse response , FilterChain chain)
每次拦截都会调用该方法。FilterChain
:Filter
链,多个 Filter 可以构成一个Filter
链
<mark>若当前 Filter 是 Filter 链的最后一个 Filter 。 将把请求给到目标 Servlet(或 jsp)</mark>
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter doFilter ...");
chain.doFilter(request, response);
}
public void destroy()
释放当前Filter
所占用的资源的方法。
在Filter
被销毁之前被调用 , <mark>且只被调用一次</mark>。
继承~实现
chain.doFilter 的执行循序
//usermaneFilter 中。。。。
System.out.println("<<---- "+username+"登录...");
// pass the request along the filter chain
chain.doFilter(request, response);
System.out.println("after dofilter ... username ... ");
// password 中 。。。
System.out.println("登录成功!");
chain.doFilter(request, response);
System.out.println("after dofilter ... password ... ");
<%
// hello.jsp 中。。。
System.out.println("jsp 。。。 ") ;
%>
<!-- 开始光标位置 -->
<h3>Hello ~ ${param.username }</h3>
dispatcher
指定过滤器锁拦截的资源被 Servlet 容器调用的方式 。
可以有四种(下面展示了)
可以设置多个 <dispatcher>
- REQUEST (默认)
拦截:直接访问 - INCLUDE
拦截:RequestDispatcher
的include()
<jsp:include page="/my/hello.jsp"></jsp:include>
- FORWARD
拦截:RequestDispatcher
的forward()
<jsp:forward page="/my/hello.jsp"></jsp:forward>
- ERROR
- 页面异常,在web.xml设置访问,才拦截
<%@page errorPage="/my/hello.jsp" %>
不拦截
清除缓存
网上一大堆
统一编码
<context-param>
<param-name>Encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.edut.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<!-- 其中的斜杠(/)表示拦截所有请求(除JSP以外) -->
<url-pattern>/*</url-pattern>
</filter-mapping>
public class EncodingFilter extends HttpFilter {
private String encoding ;
@Override
public void init() throws ServletException {
super.init();
String par = "Encoding";
encoding = getFilterConfig().getServletContext().getInitParameter(par);
}
@Override
protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain)
throws IOException, ServletException {
System.out.println("Encoding"+ " ... " + encoding );
req.setCharacterEncoding("utf-8");
chain.doFilter(req, res);
}
}