簡體   English   中英

從tomcat的Filter類方法響應servlet客戶端時如何設置http狀態代碼

[英]How to set http status code when responding to servlet client from Filter class-method in tomcat

我正在用spring(這個問題不是關於spring ...)編寫一個Web服務,該Web服務實現了(希望)靜態API。 據我了解,所有響應都應采用xml或json格式。 在大多數情況下,這並不是什么大問題。 但是在一種情況下,這似乎是不可能的。 我正在使用tomcat中涉及Servlet的工具。 由於某種原因,我不得不使用過濾器(而這就是身份驗證)。 由於我是servlet的新手,所以最終我的理解不是很好,但是對我來說,看起來像這樣

我的過濾器類是從javax.servlet.filter派生的,並且正在doFilter方法中編寫代碼:

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

在某個時候,我意識到我必須以http狀態代碼401響應客戶端,並且還想向他提供有關所發生情況的xml或json信息。 現在對我來說,好像我可以

1)使用ServletResponse:這使我可以獲得OutputStream並將xml / json寫出來。 但是,我根本無法設置http狀態代碼。 到達客戶端的最終響應確實包含一些http標頭。

2)將ServletResponse強制轉換為HttpServletResponse:這允許我設置狀態代碼,但是我似乎無法設置響應主體,但可以從tomcat處理響應主體。

兩種方法似乎都不完整。 如果我使用ServletResponse寫入OutputStream,然后轉換為HttpServletResponse,然后調用sendError(401)-希望我寫到OutputStream的所有內容都到達客戶端-我的響應不包含http“狀態行”。 但是,http標頭的存在類似於“服務器:Apache-Coyote / 1.1”

任何幫助歡迎...

我不久就實現了用於身份驗證的過濾器。 我已經編寫了類似於以下內容的代碼:

public void doFilter(ServletRequest req, ServletResponse resp,
                         FilterChain chain)
{
    HttpServletResponse response=(HttpServletResponse) resp;

    boolean authenticated=false;
    // perform authentication

    if (authenticated)
    {
         chain.doFilter(req, response);
    }
    else
    {
         // don't continue the chain
         response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
         response.setHeader("WWW-Authenticate", "BASIC realm=\"Your realm\"");

         response.setContentType("what you need");
         PrintWriter writer=response.getWriter();

         // don't set content length , don't close
    }
}

這對我有用:

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

    response.resetBuffer();
    response.getOutputStream().write("Your content".getBytes());
    HttpServletResponse hsr = (HttpServletResponse) response;
    hsr.setStatus(401);
    chain.doFilter(request, response);
}

方法HttpServletResponse :: sendError對我來說正在從SpringBoot 2.0應用程序的過濾器中返回:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (authenticated)
    {
         chain.doFilter(req, response);
    }
    else
    {
    ((HttpServletResponse) response).sendError(HttpStatus.FORBIDDEN.value(), "Authorization shall be provided");
    }
    chain.doFilter(request, response);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM