我已经获得了基于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。
为什么会发生这种情况,我该如何避免呢?