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

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

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

    posts - 3, comments - 0, trackbacks - 0, articles - 1

    TOMCAT 全局過濾

    Posted on 2013-03-01 17:33 whitesky 閱讀(507) 評論(0)  編輯  收藏
        import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Enumeration;
    import java.util.concurrent.TimeUnit;

    import javax.servlet.ServletInputStream;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;

    public class MyHttpRequestWrapper extends HttpServletRequestWrapper {
        byte[] buffer = null;
        private ServletInputStream in = null;
        private BufferedReader reader = null;
        private boolean isMultipart = false;
        private String contentType = null;

        public MyHttpRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            contentType = request.getHeader("Content-Type");
            if (contentType != null
                    && contentType.startsWith("multipart/form-data")) {
                isMultipart = true;// fileupload
                readInputStream(request);
                // read end and wrapper buffer
                ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer);// real
                                                                                    
    // servletInputStream
                in = new WrapperServletInputstream(inputStream);
                reader = new BufferedReader(new InputStreamReader(inputStream));
            }
        }

        /**
         * 讀取request流到buffer中
         * 
         * 
    @param request
         *            HttpServletRequest
         * 
    @throws IOException
         *             if throws IOException
         
    */
        private void readInputStream(HttpServletRequest request) throws IOException {
            int contentLength = request.getContentLength();
            ServletInputStream sis = request.getInputStream();
            int maxReadSize = 1024;// buffer size
            buffer = new byte[contentLength];
            int end = 0;
            int len = 0;
            while (end <= contentLength) {
                len = sis.read(buffer, end, maxReadSize);
                if (len == -1) {
                    end = contentLength;
                    break;
                }
                end += len;
                try {
                    TimeUnit.MILLISECONDS.sleep(0);// 輪詢
                } catch (InterruptedException e) {
                    // ignroe
                }
            }
            sis.close();// closed?
        }

        /**
         * if isMultipart return request inputstream to byte[]
         * 
         * 
    @return default null
         
    */
        public byte[] getRequestData() {
            return buffer;
        }

        // 重載父類獲取inputStream的方法
        @Override
        public ServletInputStream getInputStream() throws IOException {
            return isMultipart ? in : super.getInputStream();
        }

        // 重載父類獲取reader的方法
        @Override
        public BufferedReader getReader() throws IOException {
            return isMultipart ? reader : super.getReader();
        }

        /**
         * 判斷此次請求是否是上傳文件
         * 
         * 
    @return
         
    */
        public boolean isMultipart() {
            return isMultipart;
        }

        public String getRequestInfo() {
            Enumeration parameterNames = getParameterNames();
            StringBuilder parameterInfo = new StringBuilder();
            while (parameterNames.hasMoreElements()) {
                String name = parameterNames.nextElement().toString();
                String[] parameters = getParameterValues(name);
                parameterInfo.append(name).append(":[");
                for (String str : parameters) {
                    parameterInfo.append(str).append(",");
                }
                if (parameters.length > 0) {
                    parameterInfo.deleteCharAt(parameterInfo.length() - 1);
                }
                parameterInfo.append("]\n");
            }
            Enumeration headerNames = getHeaderNames();
            StringBuilder headerInfo = new StringBuilder();
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement().toString();
                Enumeration headers = getHeaders(name);
                headerInfo.append(name).append(":");
                while (headers.hasMoreElements()) {
                    headerInfo.append(headers.nextElement()).append(" ");
                }
                headerInfo.append("\n");
            }
            StringBuilder cookies = new StringBuilder();
            // for (int i = 0;i<getCookies().length;i++) {
            
    // Cookie cookie = getCookies()[i];
            
    // if(cookie==null){
            
    // continue;
            
    // }
            
    // cookies.append(cookie.getName()).append(":").append(
            
    // cookie.getValue()).append("\n");
            
    // }
            StringBuilder requestInfo = new StringBuilder().append(parameterInfo)
                    .append(headerInfo).append(cookies);
            return requestInfo.toString();
        }

        class WrapperServletInputstream extends ServletInputStream {
            private InputStream in = null;

            public WrapperServletInputstream(InputStream in) throws IOException {
                this.in = in;
            }

            @Override
            public int read() throws IOException {
                int read = in.read();
                return read;
            }

            @Override
            public synchronized void reset() throws IOException {
                in.reset();
                super.reset();
            }
        }

    }import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.io.UnsupportedEncodingException;

    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;

    public class MyHttpResponseWrapper extends HttpServletResponseWrapper {
        private ByteArrayOutputStream buffer = null;
        private ServletOutputStream out = null;
        private PrintWriter writer = null;
        private boolean usingStream = false;
        private boolean usingWriter = false;

        public MyHttpResponseWrapper(HttpServletResponse resp) throws IOException {
            super(resp);
            buffer = new ByteArrayOutputStream();// 真正存儲數據的流
            out = new WapperedOutputStream(buffer);
            writer = new PrintWriter(new OutputStreamWriter(buffer, "UTF-8"));
        }
        // 重載父類獲取outputstream的方法
        @Override
        public ServletOutputStream getOutputStream() throws IOException {
            usingStream = true;
            return out;
        }
        // 重載父類獲取writer的方法
        @Override
        public PrintWriter getWriter() throws UnsupportedEncodingException {
            usingWriter = true
            return writer;
        }
        // 重載父類獲取flushBuffer的方法
        @Override
        public void flushBuffer() throws IOException {
            if (out != null) {
                out.flush();
            }
            if (writer != null) {
                writer.flush();
            }
        }
        @Override
        public void reset() {
            buffer.reset();
        }
        public byte[] getResponseData() throws IOException {
            // 將out、writer中的數據強制輸出到WapperedResponse的buffer里面,否則取不到數據
            flushBuffer();
            return buffer.toByteArray();
        }

        // 內部類,對ServletOutputStream進行包裝
        private class WapperedOutputStream extends ServletOutputStream {
            private ByteArrayOutputStream bos = null;
            public WapperedOutputStream(ByteArrayOutputStream stream)
                    throws IOException {
                bos = stream;
            }
            @Override
            public void write(int b) throws IOException {
                bos.write(b);
            }
        }

        public boolean isUsingStream() {
            return usingStream;
        }
        public boolean isUsingWriter() {
            return usingWriter;
        }

    }// --------獲取請求內容------------------
            MyHttpRequestWrapper httpRequestWrapper = new MyHttpRequestWrapper(
                    request);// 獲取request請求內容
            MyHttpResponseWrapper httpResponseWrapper = new MyHttpResponseWrapper(
                    response);// 裝飾HttpServletRequest
            boolean passResponse = true;// 是否通過響應,默認是
            chain.doFilter(httpRequestWrapper, httpResponseWrapper);
            String encode = httpRequestWrapper.getCharacterEncoding();
            encode = encode == null ? Constant.default_charset : encode;
            String request_content = null;
            if (httpRequestWrapper.isMultipart()) {// 文件上傳內容為byte[]
                request_content = new String(httpRequestWrapper.getRequestData(),
                        encode);
            } else {// 普通上傳內容
                request_content = httpRequestWrapper.getRequestInfo();
                // System.out.println("普通上傳內容:"+request_content);
            }
            passRequest = !checkHtml.check_html(fullURL, request_content);
            if (passRequest) {
                System.out.println("passRequest:" + fullURL);
            } else {
                System.out.println("request contain keywords:" + fullURL);
                // sendErrorPage(httpRequestWrapper, response);//不轉跳 記錄日志到數據庫就可以了
                popupMessage(httpRequestWrapper, httpResponseWrapper);
                return;
            }
            byte[] response_data = httpResponseWrapper.getResponseData();
            if (httpResponseWrapper.isUsingWriter()) {
                response_data = new String(response_data, "UTF-8")
                        .getBytes(httpResponseWrapper.getCharacterEncoding());
            }
            String response_content = new String(response_data, httpResponseWrapper
                    .getCharacterEncoding());
            passResponse = !checkHtml.check_html(fullURL, response_content);
            if (passResponse) {
                System.out.println("passResponse:" + fullURL);
                OutputStream out = response.getOutputStream();// 二進制處理所有類型
                out.write(response_data);
                out.close();
            } else {
                System.out.println("can't passResponse:" + fullURL);
                sendErrorPage(httpRequestWrapper,
                        (HttpServletResponse) httpResponseWrapper.getResponse());
            } 
    在$TOMCAT_HOME/conf/web.xml配置上面的filter,完了測試了下,上傳文件處理超過16M文件時,新建buffer數組可能會報outofmemery錯誤


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 日本zzzzwww大片免费| 91免费国产精品| 妞干网免费视频在线观看| 亚洲理论在线观看| 国产成人精品免费视| 亚洲精品影院久久久久久| 曰批全过程免费视频网址| 亚洲色大成网站www永久| 免费观看无遮挡www的视频| 亚洲婷婷综合色高清在线| 免费观看的毛片大全| 亚洲七久久之综合七久久| 国产成人精品男人免费| 无码毛片一区二区三区视频免费播放| 亚洲国产精品成人网址天堂| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 国产免费午夜a无码v视频| 99久久婷婷国产综合亚洲| 国产美女做a免费视频软件| 香港特级三A毛片免费观看| 精品亚洲视频在线观看| 特级无码毛片免费视频尤物| 911精品国产亚洲日本美国韩国| 国产精品免费精品自在线观看| 四虎必出精品亚洲高清| 免费国产成人午夜私人影视| 国产日韩精品无码区免费专区国产| 亚洲国产综合无码一区| 51精品视频免费国产专区| 亚洲AV成人无码久久WWW| 在线观看亚洲av每日更新| 亚洲精品免费在线| 含羞草国产亚洲精品岁国产精品| 国产成人亚洲影院在线观看| 久久久免费的精品| 亚洲精品久久久久无码AV片软件| 国产精品亚洲产品一区二区三区| 最近免费mv在线电影| 美女被暴羞羞免费视频| 亚洲av鲁丝一区二区三区| 日本免费一本天堂在线|