Using a custom Spring Security filter, I'd like to return an HTTP 401 error code if the HTTP Header doesn't contain a particular key-value pair.
Example:
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);
}
As I understand, I could do the following:
(1) ((HttpServletResponse) res).setStatus(401)
and skip the remaining filter chain
OR
(2) throw an exception that, eventually, results in Spring Security throwing a 401 error to the client.
If #1 is the better option, how can I skip the filter chain after calling setStatus(401)
on the response?
Or, if #2 is the right way to go, which exception should I throw?
From the API docs for the doFilter
method, you can:
so setting the response status code and returning immediately without invoking chain.doFilter
is the best option for what you want to achieve here.