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