Servlet进阶API---过滤器Filter

    Filter


过滤器概念:


     过滤器就是阻挡某些事件的发生。在Web用用程序中,过滤器是介于Servlet之前,即可以拦截、过滤浏览器的请求,也可以改变对浏览器的响应。他在服务器端与客户端起到了一个中间组件的作用,对二者之间的数据信息进行过滤。当客户端浏览器发起一个请求时,服务器端的过滤器将检查请求数据中的内容,他可改变这些内容或者重新设置报头信息,再转发给服务器上被请求的目标资源,处理完毕后再向客户端相应处理结果。

    一个WEB应用程序,可以有多个过滤器,组成一个过滤器链,如经常使用过滤器完成字符编码的设定和验证用户的合法性。过滤器链中的每个过滤器都各司其职地处理并转发数据。


  《--※--》在WEB开发中,经常用过滤器来实现如下功能:

(1)对用户请求进行身份验证

(2)对用户发送的数据进行过滤或者替换

(3)转换图像的数据格式

(4)数据压缩

(5)数据加密

(6)XML数据的转换

(7)修改请求数据的字符集


在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口

即可,此接口定义了三个操作方法

  • public void init(FilterConfig filterConfig) throws ServletException
  • public void doFilter(ServletRequest request,ServletResponse response,Filt
  • erChain chain) throws IOException,ServletException
  • public void destroy()


Filter接口

   它是过滤器API的核心,所有的过滤器必须实现javax.servlet.Filter接口,该接口有三个方法,它们都由容器调用。
  public void init(FilterConfig)    在应用程序启动前,由容器调用
  public void doFilter(ServletRequest,ServletResponse,FilterChain)
  对于每个URL映射到该过滤器的请求,由容器调用该方法
  public void destroy()在应用程序关闭时,由容器调用。

FilterConfig接口

  如同Servlet有一个ServletConfig一样,过滤器也有一个FilterConig,该接口主要为过滤器提供初始化参数。声明了四个方法:

  public String getFilterName()返回部署描述文件中指定的过滤器的名称
  public String getInitParameter(String)返回在部署描述文件中指定的参数的值
  public Enumeration getInitParameterNames()返回在部署文件中指定的所有参数的名称
  public ServletContext getServletContext()
  返回web应用程序的ServletContext.过滤器可以使用ServletContext设置,获取application范围内的属性。


设置过滤器。





方法一:

采用注入的方式:

@WebFilter(

description = "demo",
filterName = "myfilter",
servletName = {"*.do"},
urlPatterns = {"/*"},
initParams = {

@WebInitParam(name = "param",value = "paramvalue")
},

dispatcherTypes = {DispatcherType.REQUEST} 

)



等价于方法二:

在WEB.XML中配置

  <filter>
    <display-name>demo</display-name>
    <filter-name>myfilter</filter-name>
    <filter-class>MyFilter</filter-class>
    
     <init-param>
    <param-name>param</param-name>
    <param-value>paramvalue</param-value>
    </init-param>
    
  </filter>
  <filter-mapping>

    <filter-name>myfilter</filter-name>

    <servlet-name>*.do</servlet-name>

    <url-pattern>/*</url-pattern>

    <dispatcher>REQUEST</dispatcher>

  </filter-mapping>









                                              实例:

实现内容替换过滤器

(1)首先,编写一个响应的封装器ResponseRepalceWrapper,用来缓存response中的内容。其源代码:

import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class ResponseRepalceWrapper extends HttpServletResponseWrapper{
	


	private CharArrayWriter charWriter = new CharArrayWriter();//缓存
	
	public ResponseRepalceWrapper(HttpServletResponse response)
	{
		//必须调用父类构造方法
		super(response);
		
	}	
	
	public PrintWriter getWriter()throws IOException
	{
		//返回字符数组Writer,缓存内容
		return new PrintWriter(charWriter);
		
	}
	
	public CharArrayWriter getCharWriter()
	{
		return charWriter;
		
	}


}


(2)编写内容过滤器ReplaceFilter:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import serv.ResponseRepalceWrapper;


public class ReplaceFilter implements Filter {

	private Properties propert = new Properties();
	
	public void init(FilterConfig filterConfig) throws ServletException {
		//通过FilterConfig获取初始化文件名
		String filePath = filterConfig.getInitParameter("filePath");
		
		try
		{
			//导入资源文件
			propert.load(ReplaceFilter.class.getClassLoader().getResourceAsStream(filePath));
			
		}catch(FileNotFoundException e)
		{
			e.printStackTrace();
			
		}catch(IOException e)
		{
			e.printStackTrace();
			
		}
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		
		
		HttpServletResponse res = (HttpServletResponse) response;
		//实例化响应器包装类
		ResponseRepalceWrapper resp = new ResponseRepalceWrapper(res);
		
		chain.doFilter(request, response);
		//缓存输出字符
		String outString = resp.getCharWriter().toString();
		//循环替换不合法的字符
		for(Object o:propert.keySet())
		{
			String key= (String) o;
			outString = outString.replace(key,propert.getProperty(key));
			
		}
		//利用原先的HttpServletResponse输出字符
		PrintWriter out = res.getWriter();
		out.write(outString);
		
	}
		
	public void destroy() {
	
	}


}

(3)创建一个properties文件






(4)最后编写一个Servlet:
@WebServlet(
		urlPatterns = {"/Test.do"},
		loadOnStartup = 0,
		name = "testServlet"
		)
public class TestServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request, response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		request.setCharacterEncoding("utf-8");
		//PrintWriter out = response.getWriter();
		request.setAttribute("aa", "赌博色情情色");
		request.getRequestDispatcher("out.jsp").forward(request, response);
		
	}

}

然后直接在JSP页面输出,就可以看到设定的敏感文字被替换了



猜你喜欢

转载自blog.csdn.net/akuang_jh/article/details/63334874