spring-security

Return HTTP Error 401 Code & Skip Filter Chains


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?


Solution

  • 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.