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); } } }