<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錯誤


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


    網站導航:
     
    主站蜘蛛池模板: 久久久久亚洲精品男人的天堂| 亚洲av综合av一区二区三区| 亚洲经典在线观看| 国产AV旡码专区亚洲AV苍井空| 美女被爆羞羞网站在免费观看| 大妹子影视剧在线观看全集免费 | 亚洲AV无码不卡在线播放| 亚洲国产二区三区久久| 国产亚洲精品仙踪林在线播放| 国产免费爽爽视频在线观看| 国产精品色午夜免费视频| 亚洲国产精品VA在线看黑人| 亚洲精品无码不卡在线播放| 中国好声音第二季免费播放| 精品国产免费一区二区| 337p日本欧洲亚洲大胆精品555588| 免费人成在线观看播放a| 国产成人免费网站| 亚洲天堂电影在线观看| 精品一区二区三区免费| 日韩一卡2卡3卡4卡新区亚洲| 亚洲一区二区三区在线观看网站| 久久久精品免费视频| 国产亚洲色视频在线| 在线精品自拍亚洲第一区| 免费无码黄十八禁网站在线观看| 免费网站看v片在线香蕉| 亚洲乱码国产乱码精品精| 一级女性全黄久久生活片免费| 免费看少妇作爱视频| 在线观看亚洲视频| 人人狠狠综合久久亚洲高清| 妇女自拍偷自拍亚洲精品| 国产又黄又爽又刺激的免费网址| 亚洲AV无码专区在线观看成人| 毛片免费观看网址| 国产精品亚洲天堂| 国产亚洲精品自在线观看| 久久久免费的精品| 精品亚洲AV无码一区二区| 日本v片免费一区二区三区|