第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Http servlet請(qǐng)求在讀取一次后會(huì)丟失來(lái)自POST主體的Params

Http servlet請(qǐng)求在讀取一次后會(huì)丟失來(lái)自POST主體的Params

Http servlet請(qǐng)求在讀取一次后會(huì)丟失來(lái)自POST主體的Params我試圖訪問(wèn)Javaservlet過(guò)濾器中的兩個(gè)http請(qǐng)求參數(shù),這里沒(méi)有什么新的,但是驚訝地發(fā)現(xiàn)這些參數(shù)已經(jīng)被消耗了!因此,它在過(guò)濾器鏈中不再可用。似乎只有當(dāng)參數(shù)出現(xiàn)在POST請(qǐng)求體(例如表單提交)中時(shí)才會(huì)發(fā)生這種情況。有沒(méi)有辦法讀取參數(shù)而不消耗它們?到目前為止,我只找到了這個(gè)引用:使用request.get參量的servlet篩選器丟失表單數(shù)據(jù).謝謝!
查看完整描述

3 回答

?
富國(guó)滬深

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊

我知道我遲到了,但這個(gè)問(wèn)題仍然與我有關(guān),所以這篇文章是谷歌最熱門(mén)的文章之一。我將繼續(xù)發(fā)布我的解決方案,希望其他人能節(jié)省幾個(gè)小時(shí)。

在我的例子中,我需要用它們的身體記錄所有請(qǐng)求和響應(yīng)。使用SpringFramework答案其實(shí)很簡(jiǎn)單,只需使用ContentCachingRequestWrapper感應(yīng)器.

import org.springframework.web.util.ContentCachingRequestWrapper;import org.springframework.web.util.ContentCachingResponseWrapper;
import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LoggingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper((HttpServletRequest) request);
        ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper((HttpServletResponse) response);

        try {
            chain.doFilter(requestWrapper, responseWrapper);
        } finally {

            String requestBody = new String(requestWrapper.getContentAsByteArray());
            String responseBody = new String(responseWrapper.getContentAsByteArray());
            // Do not forget this line after reading response content or actual response will be empty!
            responseWrapper.copyBodyToResponse();

            // Write request and response body, headers, timestamps etc. to log files

        }

    }}


查看完整回答
反對(duì) 回復(fù) 2019-07-15
?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊

唯一的方法是自己在過(guò)濾器中使用整個(gè)輸入流,從其中獲取所需的內(nèi)容,然后為所閱讀的內(nèi)容創(chuàng)建一個(gè)新的InputStream,并將InputStream放入ServletRequestWrapper(或HttpServletRequestWrapper)。

缺點(diǎn)是,您必須自己解析有效負(fù)載,標(biāo)準(zhǔn)不允許您使用該功能。

增編

正如我所說(shuō)的,您需要查看HttpServletRequestWrapper。

在過(guò)濾器中,繼續(xù)調(diào)用FilterChain.doFilter(請(qǐng)求、響應(yīng))。

對(duì)于簡(jiǎn)單的過(guò)濾器,請(qǐng)求和響應(yīng)與傳遞給過(guò)濾器的請(qǐng)求和響應(yīng)相同。不必是這樣的。您可以用自己的請(qǐng)求和/或響應(yīng)替換這些請(qǐng)求。

HttpServletRequestWrapper是專(zhuān)門(mén)為這一目的而設(shè)計(jì)的。將原始請(qǐng)求傳遞給它,然后就可以攔截所有的呼叫。您將創(chuàng)建自己的子類(lèi),并將getInputStream方法替換為您自己的方法之一。您不能更改原始請(qǐng)求的輸入流,因此可以使用這個(gè)包裝器并返回您自己的輸入流。

最簡(jiǎn)單的情況是在字節(jié)緩沖區(qū)中使用原始請(qǐng)求輸入流,在它上執(zhí)行您想要的任何魔術(shù),然后從該緩沖區(qū)創(chuàng)建一個(gè)新的ByteArrayInputStream。這就是在包裝器中返回的內(nèi)容,它被傳遞給FilterChain.doFilter方法。

您需要子類(lèi)ServletInputStream,并為ByteArrayInputStream編寫(xiě)另一個(gè)包裝器,但這也不是什么大事。


查看完整回答
反對(duì) 回復(fù) 2019-07-15
  • 3 回答
  • 0 關(guān)注
  • 1845 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)