如何 return 来自 servlet 过滤器的 HTTP 错误代码?
How to return HTTP error code from servlet filter?
我的 Web 应用程序中有一些页面只能由管理员访问。我写了过滤器,但我不明白如果用户不是管理员,如何从过滤器中 return 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 页面,但我想知道如何 return HTTP 错误代码。
您需要先将 servletResponse
转换为 HttpServletResponse
:
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 为错误代码并在 angular 拦截器中捕获错误来解决它,如下所示。
后端Java代码:
(HttpServletResponse) 响应).sendError(HttpServletResponse.SC_UNAUTHORIZED);
Angular代码:
拦截(请求:HttpRequest,下一个: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);
});
}
我的 Web 应用程序中有一些页面只能由管理员访问。我写了过滤器,但我不明白如果用户不是管理员,如何从过滤器中 return 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 页面,但我想知道如何 return HTTP 错误代码。
您需要先将 servletResponse
转换为 HttpServletResponse
:
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 为错误代码并在 angular 拦截器中捕获错误来解决它,如下所示。
后端Java代码:
(HttpServletResponse) 响应).sendError(HttpServletResponse.SC_UNAUTHORIZED);
Angular代码:
拦截(请求:HttpRequest,下一个: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);
});
}