【发布时间】:2014-06-30 12:34:57
【问题描述】:
使用自定义 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) 并跳过剩余的过滤器链
或
(2) 抛出异常,最终导致 Spring Security 向客户端抛出 401 错误。
如果 #1 是更好的选择,在响应上调用 setStatus(401) 后如何跳过过滤器链?
或者,如果 #2 是正确的方法,我应该抛出哪个异常?
【问题讨论】:
-
如果您从
setStatus之后的方法返回,将停止进一步处理请求。只有调用chain.doFilter,过滤器链才会继续。 -
谢谢卢克。我会试试的。发布作为答案?也可以请您发布一个参考,以便我可以阅读更多?
-
你可能想像这里一样实现一个 AuthenticationEntryPoint:stackoverflow.com/questions/19767267/…
标签: spring-security