You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polymer UI对接Spring REST API的LDAP身份认证问题

问题分析与解决方案

你的核心问题已经很明确了:跨域AJAX登录请求后,前端没有正确获取并使用新的JSESSIONID。从你提供的请求头对比能看到:

  • 前端AJAX登录返回的Set-Cookie是JSESSIONID=DBCAF4C1FD5D1C1655EFF873B6D556EE,但后续API请求用的却是旧的309D6615798B57247756C33808D57559
  • 而同域登录时,浏览器会自动处理302重定向并保存新的JSESSIONID,所以后续请求正常

这是因为跨域场景下,浏览器对AJAX的302重定向处理和同域不同,不会自动保留重定向响应里的Set-Cookie。下面是具体的修复步骤:


1. 修改Spring Security,禁用登录成功后的重定向

默认的表单登录成功后会返回302重定向到首页,这对AJAX场景不友好。我们需要替换成直接返回200成功响应:

protected void configure(HttpSecurity http) throws Exception {
	http
		.cors()
		.and()
		.authorizeRequests()
		.antMatchers("/login", "/","/src/**","/bower_components/**", "/oauth/authorize", "/oauth/confirm_access", "/logout", "/oauth/revoke-token","/oauth/check_token").permitAll()
		.anyRequest().authenticated()
		.and()
		.formLogin()
		.failureHandler(authFailureHandler)
		// 新增成功处理器,禁用重定向
		.successHandler(new SimpleUrlAuthenticationSuccessHandler() {
		    @Override
		    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
		        response.setStatus(HttpServletResponse.SC_OK);
		        // 可选:返回用户信息,比如JSON格式的用户名
		        // response.getWriter().write("{\"username\":\"" + authentication.getName() + "\"}");
		        response.getWriter().flush();
		    }
		})
		.permitAll()
		.and()
		.logout()
		.permitAll()
		.and()
		.rememberMe()
		.and()
		.sessionManagement()
		.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
		.and()
		.exceptionHandling()
		.and()
		.csrf().disable()
	;
}

2. 调整前端iron-ajax的配置

你的with-credentials="true"是正确的,但需要禁止自动跟随302重定向,让前端直接处理登录成功的响应:

<iron-ajax 
	id="login_request" 
	method="POST" 
	url="/login" 
	body='{"username":"xxx", "password":"xxx"}' 
	with-credentials="true"
	follow-redirects="false"  <!-- 新增这个属性,阻止自动重定向 -->
	on-response="_onLoginSuccess"
	on-error="_onLoginFailure">
</iron-ajax>

这样前端收到200响应后,浏览器会自动保存Set-Cookie里的新JSESSIONID,后续调用/api/v1/search/draft时,iron-ajax会自动携带这个新的sessionId,后台就能识别已认证的用户了。

3. 额外验证点

  • 确认浏览器允许跨域Cookie:对于localhost的不同端口,现代浏览器默认是允许的,但如果后续部署到生产环境,需要确保域名配置符合浏览器的Cookie策略(比如SameSite属性)
  • 检查你的CORS配置:当前的setAllowCredentials(true)和setAllowedOrigins是正确的,不需要修改

为什么直接访问/login页面正常?因为同域下的302重定向,浏览器会自动处理并保存新的JSESSIONID,所有后续同域请求都会携带这个新的sessionId,所以认证状态有效。而跨域AJAX的302重定向,浏览器出于安全考虑,不会自动保留重定向响应的Set-Cookie,所以必须禁用重定向,直接返回成功响应。

内容的提问来源于stack exchange,提问作者vlucian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:49:35