使用自定义Spring Security过滤器,如果HTTP标头不包含特定的键值对,我想返回HTTP 401错误代码。
示例:
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
final String val = request.getHeader(FOO_TOKEN)
if(val == null || !val.equals("FOO")) {
// token is not valid, return an HTTP 401 error code
...
}
else {
// token is good, let it proceed
chain.doFilter(req, res);
}
据我了解,我可以做以下事情:
(1)((HttpServletResponse) res).setStatus(401)
并跳过剩余的过滤器链
OR
(2)抛出异常,最终导致Spring Security向客户端抛出401错误。
如果#1是更好的选择,如何在回复中调用setStatus(401)
后跳过过滤器链?
或者,如果#2是正确的方法,我应该抛出哪个异常?
答案 0 :(得分:21)
从API docs for the doFilter
method,你可以:
因此设置响应状态代码并立即返回而不调用chain.doFilter
是您希望在此处实现的最佳选择。
答案 1 :(得分:18)
我建议在下面提供此解决方案。
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
final String val = request.getHeader(FOO_TOKEN)
if (val == null || !val.equals("FOO")) {
((HttpServletResponse) response).sendError(HttpServletResponse.SC_UNAUTHORIZED, "The token is not valid.");
} else {
chain.doFilter(req, res);
}
}
答案 2 :(得分:2)
所以您可以使用类似这样的东西。
@Override
public void doFilter() {
if (whiteListOrigins.contains(incomeOrigin)) {
httpResponse.setHeader("Access-Control-Allow-Origin", incomeOrigin);
chain.doFilter(request, response);
} else {
((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "Not Allowed to Access. Please try with valid Origin.");
}
}
答案 3 :(得分:0)
按照他们在较高答案中所说的去做。 “因此设置响应状态代码并立即返回” 这只是类型:
res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;