亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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

3 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

我知道我遲到了,但這個問題仍然與我有關,所以這篇文章是谷歌最熱門的文章之一。我將繼續發布我的解決方案,希望其他人能節省幾個小時。

在我的例子中,我需要用它們的身體記錄所有請求和響應。使用SpringFramework答案其實很簡單,只需使用ContentCachingRequestWrapper感應器.

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

        }

    }}



查看完整回答
反對 回復 2019-10-22
?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

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

缺點是,您必須自己解析有效負載,標準不允許您使用該功能。

增編

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

在過濾器中,繼續調用FilterChain.doFilter(請求、響應)。

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

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

最簡單的情況是在字節緩沖區中使用原始請求輸入流,在它上執行您想要的任何魔術,然后從該緩沖區創建一個新的ByteArrayInputStream。這就是在包裝器中返回的內容,它被傳遞給FilterChain.doFilter方法。

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



查看完整回答
反對 回復 2019-10-22
  • 3 回答
  • 0 關注
  • 591 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號