首页 > 学院 > 开发设计 > 正文

敏感内容替换(字符替换过滤器)

2019-11-08 02:30:20
字体:
来源:转载
供稿:网友

有时需要对网站内容显示进行控制,防止用户输入非法或敏感内容,常规的办法是保存数据库之前对非法内容进行替换,但这种方法具有局限性。

现在给出一种新的方法,使用过滤器。在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;    }}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表