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页面输出,就可以看到设定的敏感文字被替换了
相关文章推荐
- Servlet&JSP 第五章 进阶API、过滤器与监听器
- 我的Java之旅 第八课 Servlet 进阶API、过滤器与监听器
- 我的Java之旅 第八课 Servlet 进阶API、过滤器与监听器
- Servlet--Servlet进阶API、过滤器、监听器
- Servlet过滤器(Filter)
- servlet Filter 过滤器
- Servlet过滤器(Filter)
- Servlet学习笔记(八):过滤器Filter详解
- Servlet Filter(过滤器)----->张国亮总结心得第一季
- servlet过滤器filter
- Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
- Servlet Filter 过滤器
- jsp中用过滤器filter拦截指定页面,转到servlet处理后返回目标页面的一个小例子
- servlet过滤器之EncodingFilter
- Servlet中的过滤器Filter详解
- Servlet进阶API--ServletConfig
- Servlet Filter(过滤器)----->张国亮总结心得第一季
- Servlet 过滤器Filter
- Servlet 过滤器 Filter 常用 用法
- Jsp Servlet配置过滤器Filter