<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-193  評(píng)論-715  文章-1  trackbacks-0

    我們常常有需要在每一個(gè)頁(yè)面中加入一些內(nèi)容,而這些內(nèi)容又是固定的一些根據(jù)某些配置産生的內(nèi)容,利如我們可以為每個(gè)頁(yè)面引入共用的編碼,引入共用的JavaScript等等。

    我們知道,利用JavaEE的Filter機(jī)制,可以截獲Request和Response,並對(duì)其進(jìn)行修改。Filter實(shí)質(zhì)上是一個(gè)Chain,對(duì)其原理的解釋,可以參考網(wǎng)路上的文章,有很多講得很好,大家有空可以看看。

    1、實(shí)現(xiàn)一個(gè)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、實(shí)現(xiàn)一個(gè)HttpServletResponseWrapper

    public class CheckFrameHttpServletResponseWrapper extends
    HttpServletResponseWrapper {

    public CheckFrameHttpServletResponseWrapper(HttpServletResponse response) {

    super(response);
    }

    public PrintWriter getWriter() throws IOException{
    return new CheckFrameWriter(super.getWriter());
    }

    }

    3、實(shí)現(xiàn)一個(gè)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中加入相應(yīng)的配置,對(duì)JSP進(jìn)行攔截。


    問(wèn)題:

    現(xiàn)在發(fā)現(xiàn)對(duì)於HTML後綴的請(qǐng)求,沒(méi)有辦法改寫,即使我配置Filter匹配為/*,HTML請(qǐng)求也有進(jìn)行Filter,但還是無(wú)法改變其內(nèi)容。目前還沒(méi)有想通是為什麼?如何改進(jìn)?哪位大俠可以給予指點(diǎn)。

    posted on 2007-07-15 19:06 Robin's Programming World 閱讀(7178) 評(píng)論(4)  編輯  收藏 所屬分類: Java

    評(píng)論:
    # re: 利用Filter修改Response 2007-07-15 19:53 | xuefeng
    你的wrapper實(shí)現(xiàn)有問(wèn)題。應(yīng)當(dāng)在內(nèi)存中開辟一個(gè)ByteOutputStream,然后將攔截的響應(yīng)寫入byte[],寫入完畢后,再將wrapper的byte[]寫入真正的response對(duì)象

    下面的例子是《Spring 2.0核心技術(shù)與最佳實(shí)踐》中的例子:

    package net.livebookstore.web.filter;

    import java.io.*;

    import javax.servlet.*;
    import javax.servlet.http.*;

    /**
    * This class is used for wrapped response for getting cached data.
    *
    * @author Xuefeng
    */
    class CachedResponseWrapper extends HttpServletResponseWrapper {

    /**
    * Indicate that getOutputStream() or getWriter() is not called yet.
    */
    public static final int OUTPUT_NONE = 0;

    /**
    * Indicate that getWriter() is already called.
    */
    public static final int OUTPUT_WRITER = 1;

    /**
    * Indicate that getOutputStream() is already called.
    */
    public static final int OUTPUT_STREAM = 2;

    private int outputType = OUTPUT_NONE;

    private int status = SC_OK;
    private ServletOutputStream output = null;
    private PrintWriter writer = null;
    private ByteArrayOutputStream buffer = null;

    public CachedResponseWrapper(HttpServletResponse resp) throws IOException {
    super(resp);
    buffer = new ByteArrayOutputStream();
    }

    public int getStatus() { return status; }

    public void setStatus(int status) {
    super.setStatus(status);
    this.status = status;
    }

    public void setStatus(int status, String string) {
    super.setStatus(status, string);
    this.status = status;
    }

    public void sendError(int status, String string) throws IOException {
    super.sendError(status, string);
    this.status = status;
    }

    public void sendError(int status) throws IOException {
    super.sendError(status);
    this.status = status;
    }

    public void sendRedirect(String location) throws IOException {
    super.sendRedirect(location);
    this.status = SC_MOVED_TEMPORARILY;
    }

    public PrintWriter getWriter() throws IOException {
    if(outputType==OUTPUT_STREAM)
    throw new IllegalStateException();
    else if(outputType==OUTPUT_WRITER)
    return writer;
    else {
    outputType = OUTPUT_WRITER;
    writer = new PrintWriter(new OutputStreamWriter(buffer, getCharacterEncoding()));
    return writer;
    }
    }

    public ServletOutputStream getOutputStream() throws IOException {
    if(outputType==OUTPUT_WRITER)
    throw new IllegalStateException();
    else if(outputType==OUTPUT_STREAM)
    return output;
    else {
    outputType = OUTPUT_STREAM;
    output = new WrappedOutputStream(buffer);
    return output;
    }
    }

    public void flushBuffer() throws IOException {
    if(outputType==OUTPUT_WRITER)
    writer.flush();
    if(outputType==OUTPUT_STREAM)
    output.flush();
    }

    public void reset() {
    outputType = OUTPUT_NONE;
    buffer.reset();
    }

    /**
    * Call this method to get cached response data.
    * @return byte array buffer.
    * @throws IOException
    */
    public byte[] getResponseData() throws IOException {
    flushBuffer();
    return buffer.toByteArray();
    }

    /**
    * This class is used to wrap a ServletOutputStream and
    * store output stream in byte[] buffer.
    */
    class WrappedOutputStream extends ServletOutputStream {

    private ByteArrayOutputStream buffer;

    public WrappedOutputStream(ByteArrayOutputStream buffer) {
    this.buffer = buffer;
    }

    public void write(int b) throws IOException {
    buffer.write(b);
    }

    public byte[] toByteArray() {
    return buffer.toByteArray();
    }
    }

    }

      回復(fù)  更多評(píng)論
      
    # re: 利用Filter修改Response 2007-07-15 20:00 | xuefeng
    在Filter中調(diào)用:

    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException
    {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse)response;
    CachedResponseWrapper wrapper = new CachedResponseWrapper(httpResponse);
    // 寫入wrapper:
    chain.doFilter(request, wrapper);
    // 首先判斷status, 只對(duì)200狀態(tài)處理:
    if(wrapper.getStatus()==HttpServletResponse.SC_OK) {
    // 對(duì)響應(yīng)進(jìn)行處理,這里是進(jìn)行GZip壓縮:
    byte[] data = GZipUtil.gzip(wrapper.getResponseData());
    httpResponse.setContentType(getContentType());
    httpResponse.setContentLength(data.length);
    httpResponse.setHeader("Content-Encoding", "gzip");
    ServletOutputStream output = response.getOutputStream();
    output.write(data);
    output.flush();
    }
    }

    需要判斷狀態(tài),正確設(shè)置Content-Length,具體可參考《Spring 2.0核心技術(shù)與最佳實(shí)踐》第十一章12節(jié):利用Filter實(shí)現(xiàn)內(nèi)存緩存和靜態(tài)文件緩存
      回復(fù)  更多評(píng)論
      
    # re: 利用Filter修改Response 2007-07-16 10:19 | Robin's Java World
    @xuefeng
    謝謝!
    有機(jī)會(huì)看看你推薦的書.  回復(fù)  更多評(píng)論
      
    # re: 利用Filter修改Response 2007-07-24 13:58 | xuefeng
    這本書是我寫的,呵呵,做個(gè)廣告  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 美女黄频免费网站| 久久成人永久免费播放| 亚洲日本天堂在线| 国产精品免费久久久久影院| 13一14周岁毛片免费| 国产精品国产午夜免费福利看 | 国产亚洲综合视频| 人妻在线日韩免费视频| 最新中文字幕电影免费观看| 国产亚洲成av片在线观看| 亚洲首页国产精品丝袜| 欧美亚洲精品一区二区| 51在线视频免费观看视频| 亚洲高清资源在线观看| 国产成人精品免费视频大全| 亚洲自偷自偷偷色无码中文| 久久久亚洲精华液精华液精华液 | 亚洲不卡1卡2卡三卡2021麻豆| 一级做a爰黑人又硬又粗免费看51社区国产精品视| 成全视频高清免费观看电视剧| 亚洲AV无码成人精品区天堂| 日韩一区二区三区免费播放| 亚洲老妈激情一区二区三区| 日本黄色动图免费在线观看| 亚洲欧洲国产成人综合在线观看 | 久久综合国产乱子伦精品免费 | 俄罗斯极品美女毛片免费播放| 亚洲女人影院想要爱| 美女视频黄的免费视频网页 | 国产免费丝袜调教视频| 中文字幕精品亚洲无线码二区| 久久国产免费观看精品| 国产精品亚洲精品| 亚洲国产精品一区二区第四页| 亚洲成a∧人片在线观看无码| 毛片免费在线播放| 亚洲免费无码在线| 亚洲人成网国产最新在线| 国产成人综合亚洲亚洲国产第一页| 91精品导航在线网址免费| 亚洲欧洲久久精品|