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

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

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

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

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

3 回答

?
富國滬深

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

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

在我的例子中,我需要用它們的身體記錄所有請求和響應(yīng)。使用SpringFramework答案其實(shí)很簡單,只需使用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

        }

    }}


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

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

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

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

增編

正如我所說的,您需要查看HttpServletRequestWrapper。

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

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

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

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

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


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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