zoukankan      html  css  js  c++  java
  • 使用Filter过滤非法内容

    1、首先,需要编写一个响应的封装器ResponseReplaceWrapper,用它来缓存response中的内容,代码如下:

    ResponseReplaceWrapper.java

    package com.comp.common;
    
    import java.io.CharArrayWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    
    public class ResponseReplaceWrapper extends HttpServletResponseWrapper {
        
        private CharArrayWriter charWriter = new CharArrayWriter();
    
        public ResponseReplaceWrapper(HttpServletResponse response) {
            super(response);
        }
    
        @Override
        public PrintWriter getWriter() throws IOException {
    //return super.getWriter();
    return new PrintWriter(charWriter); } public CharArrayWriter getCharWriter() { return charWriter; } }

    2、编写内容过滤器ReplaceFilter,代码如下:

    package com.html.common;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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.annotation.WebFilter;
    import javax.servlet.http.HttpServletResponse;
    
    @WebFilter("/*")
    public class ReplaceFilter implements Filter {
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            
            HttpServletResponse res = (HttpServletResponse)response;
            ResponseReplaceWrapper resp = new ResponseReplaceWrapper(res);
            chain.doFilter(request, resp);
            
            String outString = resp.getCharWriter().toString();
            outString = outString.replace("过滤内容", "***");
            PrintWriter out = res.getWriter();
            out.write(outString);
        }
        
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            
        }
    
        @Override
        public void destroy() {
            
        }
    
    }

    通过以上步骤,就可以实现过滤非法字符了

    ResponseReplaceWrapper.java类里面声明的变量charWriter,一直不得其解,到底是在哪里赋的值。经过调试,发现是在ReplaceFilter类里面chain.doFilter(request, resp);调用完后,charWriter就有值了,我猜大概是这个方法里面有什么操作,把response里的内容赋给了charWriter。

    ResponseReplaceWrapper.java类里面复写getWriter()方法,如果返回super.getWriter(),在执行chain.doFilter(request, resp);方法后,页面就有内容输出,但是会导致charWriter没有值;如果返回new PrintWriter(charWriter),在执行chain.doFilter(request, resp);方法后,页面没有内容输出,但是charWriter就有值了,然后拿到charWriter的值,就可以修改这个值,并把修改后的值手工输出到页面上。

    我的理解就是,把要输出的内容临时保存起来,进行修改,然后把修改后的内容手工输出。

    没有看这个源代码,感觉理解的还是有点一知半解,等我看完源代码,有了更深入的理解,再做补充吧。

  • 相关阅读:
    关于 Xcode8打印JSON的时候,NSLog控制台显示不完整
    关于Xcode8打印一堆log问题
    iOS---关于UIWebView
    iOS --- UIWebView的加载本地数据的三种方式
    关于iOS10
    iOS切图文件的命名规范
    iOS---A valid provisioning profile for this executable was not found
    iOS---用Application Loader 上传的时候报错No suitable application records were found. Verify your bundle identifier 'xx' is correct
    2020Python作业15——装饰器2+迭代器
    【2020Python修炼记21】Python语法入门—生成器
  • 原文地址:https://www.cnblogs.com/modou/p/10129057.html
Copyright © 2011-2022 走看看