您的位置:首页 > 其它

Servlet进阶API---过滤器Filter

2017-03-18 23:01 435 查看

   
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页面输出,就可以看到设定的敏感文字被替换了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  filter servlet过滤器