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

1. web.xml新增Filter配置:

            
    <filter>
            <filter-name>ModifyResponseFilter</filter-name>    
            <filter-class>    
                com.xx.ls.ih.security.filters.ModifyResponseFilter    
            </filter-class>    
        </filter>

    ......

    <filter-mapping>
          <filter-name>ModifyResponseFilter</filter-name>
          <url-pattern>*.jsp</url-pattern>
          <dispatcher>REQUEST</dispatcher>
          <dispatcher>FORWARD</dispatcher>
          <dispatcher>INCLUDE</dispatcher>
        </filter-mapping>


注:对于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);
        }
        
        //覆写方法,将字符数组的内容转换后写入
        // 这里只是一个简单的例子,将<srcipt标签中,src属性中以"/"开头的资源路径面加上/tempurlprefix前缀,
        // 如:<script language=javascript src="/ls/pub/js/dtree/dtree.js">
        // 会替换为 <script language=javascript src="/tempurlprefix/ls/pub/js/dtree/dtree.js">
        public void write(char buf[], int off, int len) {
            char[] newbuf = Arrays.copyOfRange(buf, off, off + len);
            String str = String.copyValueOf(newbuf);
            String tagName = "script";
            String tagProp = "src";
            String ssoUrlPrefix = "/tempurlprefix";
            Pattern p = Pattern.compile("(<" + tagName + "\\s+[^<]*" + tagProp + "\\s*=\\s*['\"])(/ls/[^<]*>)",
                                        Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
            Matcher m = p.matcher(str);
            StringBuffer sb = new StringBuffer();
            while (m.find()) {
                m.appendReplacement(sb, m.group(1) + ssoUrlPrefix + m.group(2));
            }
            m.appendTail(sb);
            newbuf = sb.toString().toCharArray();
            super.write(newbuf, 0, newbuf.length);
        }
    }
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值