有时需要对网站内容显示进行控制,防止用户输入非法或敏感内容,常规的办法是保存数据库之前对非法内容进行替换,但这种方法具有局限性。
现在给出一种新的方法,使用过滤器。在Web服务器获得用户请求之前,过滤器可以访问该请求,在Web服务器将输出响应给用户之前,过滤器还可以访问该响应,可以在过滤器中将该响应转换为自定义响应,最后将过滤后的自定义响应返回给客户端。
关于FilterChain对象的doFilter方法,通俗的讲doFilter就像一扇门,用户请求(request)在过滤器执行一些操作后,通过doFilter方法,到达下一个过滤器或者直接是资源文件,Web服务器收到请求后响应(response)用户,response又会通过doFilter这扇门回到之前过滤器doFilter方法中,执行chain.doFilter()方法后面的语句,在这时,可以对response进行修改,比如将敏感字符替换。
过滤器图解:
下面是一个自定义响应对象的类,继承了HttpServletResponseWrapper类,里面重写了toString方法,getWriter方法。
package com.yykj.servlet;import javax.servlet.http.*;import java.io.CharArrayWriter;import java.io.PRintWriter;public class Wrapper extends HttpServletResponseWrapper { private CharArrayWriter charArrayWriter;//字符数组输出流 public Wrapper(HttpServletResponse response){ super(response);//父类构造方法 this.charArrayWriter = new CharArrayWriter(); } @Override public String toString(){ return charArrayWriter.toString(); } @Override public PrintWriter getWriter(){//从服务器传出过程中会调用 return new PrintWriter(charArrayWriter);//使得输出流为charArrayWriter类型 }}过滤器代码:package com.yykj.servlet;import javax.servlet.*;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;public class CTFilter implements Filter { private FilterConfig filterConfig = null; public void init(FilterConfig filterConfig){ System.out.println("init"); this.filterConfig = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException{ response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); Wrapper wrapper = new Wrapper((HttpServletResponse) response);//自定义响应 filterChain.doFilter(request, wrapper);//如果wrapper不传进去,他的字符串就为空,getWriter在这传递过程中调用 String resStr = wrapper.toString().trim(); String newStr = ""; if (resStr.indexOf("法轮功") > 0) {//简单的非法字符替换 newStr = resStr.replace("法轮功", "***"); } out.println(newStr); } public void destroy(){ this.filterConfig = null; }}
新闻热点
疑难解答