利用Filter及HttpServletResponseWrapper修改Response的内容(内容更改利用正则表达式)

1. web.xml新增Filter配置:

            
    
            ModifyResponseFilter    
                
                com.xx.ls.ih.security.filters.ModifyResponseFilter    
                
        

    ......

    
          ModifyResponseFilter
          *.jsp
          REQUEST
          FORWARD
          INCLUDE
        


注:对于servlet2.4及以上,filter不会截取server内部的请求,比如forward,所以需要配置dispatcher属性。

2.  ModifyResponseFilter实现

package com.xx.ls.ih.security.filters;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import com.xx.foundation.module.web.filter.GenericFilter;
import edu.emory.mathcs.backport.java.util.Arrays;

public class ModifyResponseFilter extends GenericFilter {
    @Override
    protected void executeFilter(ServletRequest request,
            ServletResponse response, FilterChain filterChain) throws Exception {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        String requestURI = httpServletRequest.getRequestURI();
        //匹配jsp的请求
        if (requestURI.endsWith("jsp")) {
            //如果是jsp的请求,传入filterChain的Response设为自定义的Wrapper后的Response
            HttpServletResponseWrapperURL wrapper = new HttpServletResponseWrapperURL(
                    (HttpServletResponse) response);
            filterChain.doFilter(request, wrapper);
        } else {
            filterChain.doFilter(httpServletRequest, httpServletResponse);
        }
    }

    private class HttpServletResponseWrapperURL extends
            HttpServletResponseWrapper {
        public HttpServletResponseWrapperURL(HttpServletResponse response) {
            super(response);
        }
        //覆写getWriter()方法,返回自定义的PrintWriterURL对象
        public PrintWriter getWriter() throws IOException {
            return new PrintWriterURL(super.getWriter());
        }
    }

    private class PrintWriterURL extends PrintWriter {
        public PrintWriterURL(Writer out) {
            super(out);
        }
        
        //覆写方法,将字符数组的内容转换后写入
        // 这里只是一个简单的例子,将
        // 会替换为 
                    
                    

你可能感兴趣的:(java,web)