Java中的过滤器(Filter)

本文深入讲解了Servlet过滤器(Filter)的概念,工作原理及其在Web应用程序中的应用。通过实例演示了如何使用web.xml配置和注解配置过滤器,以及如何通过过滤器修改请求和响应的编码格式。

一、什么是过滤器(Filter)

   过滤器是对Servlet容器调用Servlet的过程进行拦截过滤,从而在Servlet进行相应处理的前后实现一些特殊功能。

   Filter程序是一个现实Filter接口的java类,由Servlet容器进行调用和执行。Filter程序需要在web.xml文件中进行注册和设置他所连接的资源。

二、过滤器的工作原理

   当在web.xml中注册一个Filter来对某个Servlet程序进行拦截处理时,这个Filter就会成为Servlet容器与Servlet程序直接的一道关卡,该Filter可以对Servlet容器的请求和Servlet程序送回给Servlet容器响应进行拦截,可以决定是否将请求继续传递给Servlet程序,以及对请求和响应信息是否进行修改。

三、应用(使用web.xml配置方式)

@WebServlet("/oneServlet")
public class OneServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("2.OneServlet开始执行...");
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("one Servlet");
		System.out.println("3.one servlet执行完毕...");
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
public class OneFilter implements Filter{
    /**
    *构造器
    */
	public OneFilter() {
		System.out.println("constructor");
	}
	
	/**
	 * 初始化方法
	 */
	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("init");
		String encoding = config.getInitParameter("encoding");
		System.out.println("filter中配置的编码格式:"+encoding);
	}
	
    /**
	 * 执行过滤
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		System.out.println("1.OneFilter开始过滤");
		//放行
		chain.doFilter(request, response);
		response.getWriter().write("hello");
		System.out.println("4.OneFilter过滤完毕");
	}
	
	/**
	 * 销毁
	 */
	@Override
	public void destroy() {
		System.out.println("destroy");
		
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>006Fliter</display-name>
    
<!--配置过滤器-->
  <filter>
    <filter-name>oneFilter</filter-name>
    <filter-class>com.szy.filter.OneFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>oneFilter</filter-name>
    <url-pattern>/oneServlet</url-pattern>
  </filter-mapping>

</web-app>

三、应用(使用注解配置方式)

@WebFilter("/oneServlet")  //拦截的Servlet
public class ThreeFilter implements Filter {

    public ThreeFilter() {
    	
    }

    public void init(FilterConfig fConfig) throws ServletException {
	
    }
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("ThreeFilter");
		chain.doFilter(request, response);
	}
	
	public void destroy() {
	
	}
}

四、典型案例:使用过滤器修改请求响应的编码

public class EncodingFilterFilter implements Filter {
	String encoding = null;
    public EncodingFilterFilter() {
    	
    }

    public void init(FilterConfig fConfig) throws ServletException {
    	encoding = fConfig.getInitParameter("encoding");
    }
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		//设置编码格式
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		req.setCharacterEncoding(encoding);
		res.setCharacterEncoding(encoding);
		chain.doFilter(req, res);
	}
	
	public void destroy() {
	
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>006Fliter</display-name>

  <!-- 设置编码格式 -->
  <!-- EncodingFilter -->
  <filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>com.szy.filter.EncodingFilterFilter</filter-class>
  	<init-param>
  		<param-name>encoding</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>

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值