为什么Spring有时不会将请求委托给控制器?

时间:2018-05-18 11:09:36

标签: java spring spring-security filter

我已经获得了基于Jetty的Spring 4和Spring security 3的应用程序。

只有一个用户可以使用相同的凭据登录。如果有人使用相同的用户名登录,则之前的用户将自动注销。如果应用程序单独执行它,它们都可以正常工作,但有时您会有延迟,因此您需要向服务器请求注销。

但是,如果我在使用两种不同的浏览器登录时尝试刷新页面,那么我只有200 OK响应而没有任何信息。 在下次刷新之后,我将对内部信息进行有效响应。

我在security.xml

中找到了一些过滤器
<http use-expressions="true" entry-point-ref="restAuthenticationEntryPoint">
    <access-denied-handler ref="accessDeniedHandler"/>
    <custom-filter ref="responseFilter" position="FIRST"/>
    <custom-filter ref="httpRequestSessionIdFilter" position="PRE_AUTH_FILTER"/>
    <custom-filter ref="corsFilter" position="HEADERS_FILTER"/>
    <custom-filter ref="preLogoutFilter" before="LOGOUT_FILTER"/>

我认为ResponseFilter之后的某个地方出了问题。在这种情况下,不会调用其他自定义过滤器:

public final class ResponseFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException {
    ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) response);
    HttpServletRequest httpRequest = (HttpServletRequest) request;

    chain.doFilter(request, responseWrapper);
    String responseContent = new String(responseWrapper.getDataStream());

如果响应数据为空且可行,我尝试再次调用chain.doFilter,但响应状态和数据被拆分为两个不同的JSON。

为什么会发生这种情况,我该如何避免呢?

0 个答案:

没有答案