spring security - 在身份验证中sessionId为null

时间:2014-03-04 13:53:59

标签: java spring rest authentication spring-security

我有以下功能

@Override
public void onAuthenticationSuccess(HttpServletRequest request
        , HttpServletResponse response, Authentication authentication)
           throws IOException, ServletException {

      String sessionId = ((WebAuthenticationDetails) authentication
            .getDetails()).getSessionId();

}

我正在尝试使用以下代码对服务器进行身份验证:

 HttpClient client = new HttpClient();
 CommonsClientHttpRequestFactory commons 
         = new CommonsClientHttpRequestFactory(client);

 RestTemplate template = new RestTemplate(commons);
 MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>()
 map.add("j_username", "11");
 map.add("j_password", "22");           
 Object result2 = template.postForObject(
        "http://localhost:8080/APP/j_spring_security_check", map,Object.class);

事实是,凭证是合法的,我确实输入了onSuccess,但每次我使用上面的代码时,sessionId都为空。

当我通过表单进行身份验证时,它会创建一个会话ID。 当我设置

 <security:http create-session="always" />

它确实有效。但我相信每次都会开一个会话,可能效率很低。

任何想法为什么会话id在java post请求中为null并且表单不是?以及如何解决它?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果没有看到应用程序的其余部分和Spring Security配置,很难说。您可以使用<debug>元素轻松启用Spring Security调试,该元素将提供在登录表单中创建会话的堆栈跟踪。我猜这可能是因为您的应用程序正在使用JSP,并且当您查看登录表单时JSP正在创建会话。在使用RestTemplate发布的实例中,在您提交用户名和密码之前它不会创建会话(onSuccess的会话是在您提交凭据之前的会话)。