簡體   English   中英

如何從 servlet 過濾器返回 HTTP 錯誤代碼?

[英]How to return HTTP error code from servlet filter?

我的 Web 應用程序中有只有管理員才能訪問的頁面。 我寫了過濾器,但我不明白如果用戶不是管理員,如何從過濾器返回 HTTP 錯誤代碼(403)。

public class AdminFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");

        UserDao userDaoImpl = new UserDaoImpl();
        if(userDaoImpl.findByUsername(username).getPassword().equals(password)) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //respond with 403
        }
    }
}

我知道我可以重定向到我的自定義 403 頁面,但我想知道如何返回 HTTP 錯誤代碼。

您需要servletResponseHttpServletResponse

HttpServletResponse response = (HttpServletResponse) servletResponse;

然后使用它的sendError()方法:

response.sendError(HttpServletResponse.SC_FORBIDDEN);

SC_FORBIDDEN代表代碼 403。

順便說一下,你不會重定向到 403 頁面,你只是用那個狀態來響應。 如果這樣做,servlet 容器將為用戶提供一個特殊的 403 頁面。 您可以在web.xml配置該頁面:

<error-page>
    <error-code>403</error-code>
    <location>/error-403.htm</location>
</error-page>

這會指示容器在您設置 403 狀態時為您的自定義頁面/error-403.htm提供服務。

如果您想要重定向,可以使用response.sendRedirect() (它發出 302 重定向)。

我是這樣解決的:

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_BAD_REQUEST);
(HttpServletResponse) response).sendError(HttpServletResponse.SC_BAD_REQUEST, "HMAC Failed - X-Authenticated-Id not available");
return;

通過在后端將401設置為錯誤代碼並在角度攔截器中捕獲錯誤來解決它,如下所示。

后端Java代碼:

(HttpServletResponse) 響應).sendError(HttpServletResponse.SC_UNAUTHORIZED);

角度代碼:

攔截(req: HttpRequest, next: HttpHandler): Observable> {

    return next.handle(req)
        .catch(error => {

            if (error instanceof HttpErrorResponse && error.status == 401) {
                this.router.navigateByUrl('/sessionExpired', { replaceUrl: true });

                return new EmptyObservable();
            }
            return _throw(error);
        });
}

暫無
暫無

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

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