创建一个 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):类似于 Servletinit 方法。
    在创建 Filter 对象(Filter对象立即被调用),而且只被调用一次 ⇒ <mark>单例</mark>。
    • FilterConfig 类似于 ServletConfig
    • 可以在 web.xml 文件中配置。
  • public void doFilter(ServletRequest request , ServletResponse response , FilterChain chain)
    每次拦截都会调用该方法。
    • FilterChainFilter 链,多个 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
    拦截:RequestDispatcherinclude()
    <jsp:include page="/my/hello.jsp"></jsp:include>
  • FORWARD
    拦截:RequestDispatcherforward()
    <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);
	}
}

检查用户是否登录