我們常常有需要在每一個頁面中加入一些內(nèi)容,而這些內(nèi)容又是固定的一些根據(jù)某些配置産生的內(nèi)容,利如我們可以為每個頁面引入共用的編碼,引入共用的JavaScript等等。
我們知道,利用JavaEE的Filter機制,可以截獲Request和Response,並對其進行修改。Filter實質(zhì)上是一個Chain,對其原理的解釋,可以參考網(wǎng)路上的文章,有很多講得很好,大家有空可以看看。
1、實現(xiàn)一個Filter,代碼如下:
public class MyFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) {
CheckFrameHttpServletResponseWrapper wrapper = new CheckFrameHttpServletResponseWrapper(
(HttpServletResponse) response);
try {
filterChain.doFilter(request, wrapper);
} catch (Exception e) {
e.printStackTrace();
}
}
public void destroy() {
}
public void init(FilterConfig arg0) throws ServletException {
}
}
2、實現(xiàn)一個HttpServletResponseWrapper
public class CheckFrameHttpServletResponseWrapper extends
HttpServletResponseWrapper {
public CheckFrameHttpServletResponseWrapper(HttpServletResponse response) {
super(response);
}
public PrintWriter getWriter() throws IOException{
return new CheckFrameWriter(super.getWriter());
}
}
3、實現(xiàn)一個Writer
public class CheckFrameWriter extends PrintWriter {
String checkString = "<script>\n if(window.top.frames.length==0){\n"
+ "window.location.href=\"https://aix:9080/sso/mainlayout.faces?"
+ "contentURL=http://aix:9080/security/paramsMaintain/"
+ "addParams.faces?roleId=0001\"\n" + "}\n</script>\n";
public CheckFrameWriter(Writer out) {
super(out);
}
public void write(int c) {
super.write((char) c);
}
public void write(char buf[], int off, int len) {
StringBuffer sb = new StringBuffer(len);
for (int i = 0; i < len; i++) {
sb.append(buf[off + i]);
}
String s = sb.toString();
int bodyIndex = s.indexOf("<body>");
if (bodyIndex > -1) {
String part1 = s.substring(0, bodyIndex);
String part2 = s.substring(bodyIndex );
s = part1 + checkString + part2;
}
for (int i = 0; i < s.length(); i++) {
write(s.charAt(i));
}
}
public void write(String s, int off, int len) {
for (int i = 0; i < len; i++) {
write(s.charAt(off + i));
}
}
}
在Writer中,你便可以隨心所欲的修改Response的內(nèi)容了。
4、在Web.xml中加入相應的配置,對JSP進行攔截。
問題:
現(xiàn)在發(fā)現(xiàn)對於HTML後綴的請求,沒有辦法改寫,即使我配置Filter匹配為/*,HTML請求也有進行Filter,但還是無法改變其內(nèi)容。目前還沒有想通是為什麼?如何改進?哪位大俠可以給予指點。