免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
關于urlDecode和tomcat一些源碼

1. 看下面源碼,找到%號,每次加2,然后將16進制轉換為int,也就是%號后兩位加2得到16進制,轉換為int

                   while ( ((i+2) < numChars) && (c=='%')) {                        int v = Integer.parseInt(s.substring(i+1,i+3),16);                        if (v < 0)                            throw new IllegalArgumentException("URLDecoder: Illegal hex characters in escape (%) pattern - negative value");                        bytes[pos++] = (byte) v;                        i+= 3;                        if (i < numChars)                            c = s.charAt(i);                    }

這就是為什么url中不能有%號的原因,

 

2. 下面錯就有可能url中有特殊字符,比如 %

Note that the name and value quoted here may be corrupted due to the failed decoding. Use debug level logging to see the original, non-corrupted values.Note: further occurrences of Parameter errors will be logged at DEBUG level.

3. request.getParameter("Json");這個獲得的是 null,urldecode之后的,因為urldecode出錯了,所以會是null

4. request.getQueryString();這個得到的是,沒有urldecode的,也就是原始的

二、 關于看tomcat源碼的一些知識點,這是一個鏈接到達tomcat之后,要執(zhí)行的過程,為什么要總結呢,request.getParameter("Json");中,如果Json中有特殊符號,如%,服務器會的到null,就是因為urldecode導致,看了源碼什么都懂了

 

String an = request.getQueryString();   //獲取沒有被urldecode的參數值

String an = request.getParameter("Json"); //獲取被urldecode解碼后的參數值

 

1.  org.apache.catalina.connector.Connector  ,其中還有很多關于配置的在這個類中,自己看

 

 public Connector(String protocol) {        setProtocol(protocol);        // Instantiate protocol handler        try {            Class<?> clazz = Class.forName(protocolHandlerClassName);            this.protocolHandler = (ProtocolHandler) clazz.newInstance();        } catch (Exception e) {            log.error(sm.getString(                    "coyoteConnector.protocolHandlerInstantiationFailed"), e);        }    }

構造函數中  protocol  對應  server.xml  protocol="HTTP/1.1"   所以構造函數中的 protocol 值為 HTTP/1.1

  <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxHttpHeaderSize="1048576"/>

 

2. org.apache.catalina.connector.RequestFacade implements HttpServletRequest

 public String getParameter(String name) { //不是這個方法,下面那個方法        if (request == null) {            throw new IllegalStateException(                            sm.getString("requestFacade.nullRequest"));        }        if (Globals.IS_SECURITY_ENABLED){            return AccessController.doPrivileged(                new GetParameterPrivilegedAction(name));        } else {            return request.getParameter(name);        }    }

 

 @Override    public Map<String,String[]> getParameterMap() {//這個方法        if (request == null) {            throw new IllegalStateException(                            sm.getString("requestFacade.nullRequest"));        }        if (Globals.IS_SECURITY_ENABLED){            return AccessController.doPrivileged(                new GetParameterMapPrivilegedAction());        } else {            return request.getParameterMap();        }    }

 

 public Map<String, String[]> getParameterMap() {        if (parameterMap.isLocked()) {            return parameterMap;        }        Enumeration<String> enumeration = getParameterNames();        while (enumeration.hasMoreElements()) {            String name = enumeration.nextElement();            String[] values = getParameterValues(name);            parameterMap.put(name, values);        }        parameterMap.setLocked(true);        return parameterMap;    }

 

 public Enumeration<String> getParameterNames() {        if (!parametersParsed) {            parseParameters();        }        return coyoteRequest.getParameters().getParameterNames();    }

 

 

3. org.apache.catalina.connector.Request implements HttpServletRequest

 public String getParameter(String name) {        if (!parametersParsed) {            parseParameters();        }        return coyoteRequest.getParameters().getParameter(name);    }

4. org.apache.catalina.connector.Request implements HttpServletRequest

protected void parseParameters() {        parametersParsed = true;        Parameters parameters = coyoteRequest.getParameters();        boolean success = false;        try {            // Set this every time in case limit has been changed via JMX            parameters.setLimit(getConnector().getMaxParameterCount());  //參數的數量最多為10000            // getCharacterEncoding() may have been overridden to search for            // hidden form field containing request encoding            String enc = getCharacterEncoding();            boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();            if (enc != null) {                parameters.setEncoding(enc);                if (useBodyEncodingForURI) {                    parameters.setQueryStringEncoding(enc);                }            } else {                parameters.setEncoding                    (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);                if (useBodyEncodingForURI) {                    parameters.setQueryStringEncoding                        (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);                }            }            parameters.handleQueryParameters();            if (usingInputStream || usingReader) {                success = true;                return;            }            if( !getConnector().isParseBodyMethod(getMethod()) ) {                success = true;                return;            }            String contentType = getContentType();            if (contentType == null) {                contentType = "";            }            int semicolon = contentType.indexOf(';');            if (semicolon >= 0) {                contentType = contentType.substring(0, semicolon).trim();            } else {                contentType = contentType.trim();            }            if ("multipart/form-data".equals(contentType)) {                parseParts();                success = true;                return;            }            if (!("application/x-www-form-urlencoded".equals(contentType))) {                success = true;                return;            }            int len = getContentLength();            if (len > 0) {                int maxPostSize = connector.getMaxPostSize();                if ((maxPostSize > 0) && (len > maxPostSize)) {                    if (context.getLogger().isDebugEnabled()) {                        context.getLogger().debug(                                sm.getString("coyoteRequest.postTooLarge"));                    }                    checkSwallowInput();                    return;                }                byte[] formData = null;                if (len < CACHED_POST_LEN) {                    if (postData == null) {                        postData = new byte[CACHED_POST_LEN];                    }                    formData = postData;                } else {                    formData = new byte[len];                }                try {                    if (readPostBody(formData, len) != len) {                        return;                    }                } catch (IOException e) {                    // Client disconnect                    if (context.getLogger().isDebugEnabled()) {                        context.getLogger().debug(                                sm.getString("coyoteRequest.parseParameters"), e);                    }                    return;                }                parameters.processParameters(formData, 0, len);            } else if ("chunked".equalsIgnoreCase(                    coyoteRequest.getHeader("transfer-encoding"))) {                byte[] formData = null;                try {                    formData = readChunkedPostBody();                } catch (IOException e) {                    // Client disconnect or chunkedPostTooLarge error                    if (context.getLogger().isDebugEnabled()) {                        context.getLogger().debug(                                sm.getString("coyoteRequest.parseParameters"), e);                    }                    return;                }                if (formData != null) {                    parameters.processParameters(formData, 0, formData.length);                }            }            success = true;        } finally {            if (!success) {                parameters.setParseFailed(true);            }        }    }

 

 

 

 

 

5. org.apache.tomcat.util.http.Parameters  中  processParameters

         

  private void processParameters(byte bytes[], int start, int len,                                  Charset charset) {        if(log.isDebugEnabled()) {            log.debug(sm.getString("parameters.bytes",                    new String(bytes, start, len, DEFAULT_CHARSET)));        }        int decodeFailCount = 0;        int pos = start;        int end = start + len;        while(pos < end) {            int nameStart = pos;            int nameEnd = -1;            int valueStart = -1;            int valueEnd = -1;            boolean parsingName = true;            boolean decodeName = false;            boolean decodeValue = false;            boolean parameterComplete = false;            do {                switch(bytes[pos]) {                    case '=':                        if (parsingName) {                            // Name finished. Value starts from next character                            nameEnd = pos;                            parsingName = false;                            valueStart = ++pos;                        } else {                            // Equals character in value                            pos++;                        }                        break;                    case '&':                        if (parsingName) {                            // Name finished. No value.                            nameEnd = pos;                        } else {                            // Value finished                            valueEnd  = pos;                        }                        parameterComplete = true;                        pos++;                        break;                    case '%':                    case '+':                        // Decoding required                        if (parsingName) {                            decodeName = true;                        } else {                            decodeValue = true;                        }                        pos ++;                        break;                    default:                        pos ++;                        break;                }            } while (!parameterComplete && pos < end);            if (pos == end) {                if (nameEnd == -1) {                    nameEnd = pos;                } else if (valueStart > -1 && valueEnd == -1){                    valueEnd = pos;                }            }            if (log.isDebugEnabled() && valueStart == -1) {                log.debug(sm.getString("parameters.noequal",                        Integer.valueOf(nameStart), Integer.valueOf(nameEnd),                        new String(bytes, nameStart, nameEnd-nameStart,                                DEFAULT_CHARSET)));            }            if (nameEnd <= nameStart ) {                if (valueStart == -1) {                    // &&                    if (log.isDebugEnabled()) {                        log.debug(sm.getString("parameters.emptyChunk"));                    }                    // Do not flag as error                    continue;                }                // &=foo&                UserDataHelper.Mode logMode = userDataLog.getNextMode();                if (logMode != null) {                    String extract;                    if (valueEnd > nameStart) {                        extract = new String(bytes, nameStart, valueEnd                                - nameStart, DEFAULT_CHARSET);                    } else {                        extract = "";                    }                    String message = sm.getString("parameters.invalidChunk",                            Integer.valueOf(nameStart),                            Integer.valueOf(valueEnd), extract);                    switch (logMode) {                        case INFO_THEN_DEBUG:                            message += sm.getString("parameters.fallToDebug");                            //$FALL-THROUGH$                        case INFO:                            log.info(message);                            break;                        case DEBUG:                            log.debug(message);                    }                }                parseFailed = true;                continue;                // invalid chunk - it's better to ignore            }            tmpName.setBytes(bytes, nameStart, nameEnd - nameStart);            if (valueStart >= 0) {                tmpValue.setBytes(bytes, valueStart, valueEnd - valueStart);            } else {                tmpValue.setBytes(bytes, 0, 0);            }            // Take copies as if anything goes wrong originals will be            // corrupted. This means original values can be logged.            // For performance - only done for debug            if (log.isDebugEnabled()) {                try {                    origName.append(bytes, nameStart, nameEnd - nameStart);                    if (valueStart >= 0) {                        origValue.append(bytes, valueStart, valueEnd - valueStart);                    } else {                        origValue.append(bytes, 0, 0);                    }                } catch (IOException ioe) {                    // Should never happen...                    log.error(sm.getString("parameters.copyFail"), ioe);                }            }            try {                String name;                String value;                if (decodeName) {                    urlDecode(tmpName);                }                tmpName.setCharset(charset);                name = tmpName.toString();                if (valueStart >= 0) {                    if (decodeValue) {                        urlDecode(tmpValue);                    }                    tmpValue.setCharset(charset); //ISO-8859-1                    value = tmpValue.toString();                } else {                    value = "";                }                try {                    addParameter(name, value);  // 添加到參數集合中                } catch (IllegalStateException ise) {                    // Hitting limit stops processing further params but does                    // not cause request to fail.                    parseFailed = true;                    UserDataHelper.Mode logMode = maxParamCountLog.getNextMode();                    if (logMode != null) {                        String message = ise.getMessage();                        switch (logMode) {                            case INFO_THEN_DEBUG:                                message += sm.getString(                                        "parameters.maxCountFail.fallToDebug");                                //$FALL-THROUGH$                            case INFO:                                log.info(message);                                break;                            case DEBUG:                                log.debug(message);                        }                    }                    break;                }            } catch (IOException e) {                parseFailed = true;                decodeFailCount++;                if (decodeFailCount == 1 || log.isDebugEnabled()) {                    if (log.isDebugEnabled()) {                        log.debug(sm.getString("parameters.decodeFail.debug",                                origName.toString(), origValue.toString()), e);                    } else if (log.isInfoEnabled()) {                        UserDataHelper.Mode logMode = userDataLog.getNextMode();                        if (logMode != null) {                            String message = sm.getString(                                    "parameters.decodeFail.info",                                    tmpName.toString(), tmpValue.toString());                            switch (logMode) {                                case INFO_THEN_DEBUG:                                    message += sm.getString("parameters.fallToDebug");                                    //$FALL-THROUGH$                                case INFO:                                    log.info(message);                                    break;                                case DEBUG:                                    log.debug(message);                            }                        }                    }                }            }            tmpName.recycle();            tmpValue.recycle();            // Only recycle copies if we used them            if (log.isDebugEnabled()) {                origName.recycle();                origValue.recycle();            }        }        if (decodeFailCount > 1 && !log.isDebugEnabled()) {            UserDataHelper.Mode logMode = userDataLog.getNextMode();            if (logMode != null) {                String message = sm.getString(                        "parameters.multipleDecodingFail",                        Integer.valueOf(decodeFailCount));                switch (logMode) {                    case INFO_THEN_DEBUG:                        message += sm.getString("parameters.fallToDebug");                        //$FALL-THROUGH$                    case INFO:                        log.info(message);                        break;                    case DEBUG:                        log.debug(message);                }            }        }    }

6. org.apache.tomcat.util.buf.UDecoder

    

public final String convert(String str, boolean query)    {        if (str == null) {            return  null;        }        if( (!query || str.indexOf( '+' ) < 0) && str.indexOf( '%' ) < 0 ) {            return str;        }        final boolean noSlash = !(ALLOW_ENCODED_SLASH || query);        StringBuilder dec = new StringBuilder();    // decoded string output        int strPos = 0;        int strLen = str.length();        dec.ensureCapacity(str.length());        while (strPos < strLen) {            int laPos;        // lookahead position            // look ahead to next URLencoded metacharacter, if any            for (laPos = strPos; laPos < strLen; laPos++) {                char laChar = str.charAt(laPos);                if ((laChar == '+' && query) || (laChar == '%')) {                    break;                }            }            // if there were non-metacharacters, copy them all as a block            if (laPos > strPos) {                dec.append(str.substring(strPos,laPos));                strPos = laPos;            }            // shortcut out of here if we're at the end of the string            if (strPos >= strLen) {                break;            }            // process next metacharacter            char metaChar = str.charAt(strPos);            if (metaChar == '+') {                dec.append(' ');                strPos++;                continue;            } else if (metaChar == '%') {                // We throw the original exception - the super will deal with                // it                //                try {                char res = (char) Integer.parseInt(   //得到%號后面兩個字符,之后以16進制轉換成int類型再轉換成char類型,之后追加到dec上                        str.substring(strPos + 1, strPos + 3), 16);                if (noSlash && (res == '/')) {                    throw new IllegalArgumentException("noSlash");                }                dec.append(res);                strPos += 3;            }        }        return dec.toString();    }

 

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
quercus 數據庫中文亂碼問題研究, 解決了.
基于C#的詞典接口調用代碼實例
jdbc
eoLinker-API Shop IP地址查詢 Java調用示例代碼
使用Android Facebook SDK V4.0獲取日期
用C#生成中文漢字驗證碼的基本原理
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服