[英]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.