response.sendError使用自定义过滤器抛出异常

时间:2014-04-11 03:55:52

标签: java spring spring-security servlet-filters

我有一个注册表格,提交后我需要: 创建一个新用户并注册该用户。

如果用户名已在数据库中,我需要返回409并显示错误消息。

我已经创建了一个自定义过滤器来设置HttpStatus

public class UserSignupFilter implements Filter {
...
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (userSignup(request)) {
            if (userAlreadyExists(request)){
                logger.info("Didnt create user since: "+e.getMessage());
                response.sendError(HttpStatus.CONFLICT.value());
            } else {
                createUser(request);
            }
        }           
        chain.doFilter(request, response);
    }
}

问题在于我有时会得到:

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed.  

有更好的方法吗? 我以编程方式设置安全性(Spring Security V 3.2)如何使用ExceptionTranslationFilter?

2 个答案:

答案 0 :(得分:1)

我认为你不应该打电话:

chain.doFilter(request, response);

如果您只想发回错误代码。只需致电回复

logger.info("Didnt create user since: "+e.getMessage());
response.sendError(HttpStatus.CONFLICT.value());
return;

答案 1 :(得分:0)

如果要使用ExceptionTranslationFilter,则需要抛出异常(不提交响应)。只要您的过滤器位于下游(如果安全过滤器应该执行此过滤器),或者在异常转换过滤器之后将过滤器放在安全过滤器链中。