gpt4 book ai didi

ajax - Spring 安全性 + Ajax session 超时问题

转载 作者:IT老高 更新时间:2023-10-28 13:47:25 26 4
gpt4 key购买 nike

我有一个使用 Spring MVC 构建的应用程序并使用 Spring 安全性进行保护,一堆 Controller 是 JSON 休息服务,它们都受到保护。我正在使用 LoginUrlAuthenticationEntryPoint 来检测 AJAX 请求并在发生 session 超时时发送 403 ERROR CODE - 所有其他请求都会被重定向回登录页面。

下面是 Spring Security XML 片段和 authenticationEntryPoint java 类。

问题是 session 超时后的第一个 AJAX 请求,Spring 重定向到登录页面并返回登录页面 HTML,如果我尝试再次执行 AJAX 请求(重定向发生后),authenticationEntryPoint 将执行并返回 HTTP 错误代码 403 .我尝试过使用这种机制 http://distigme.wordpress.com/2012/11/01/ajax-and-spring-security-form-based-login/ 做同样的事情并且发生了同样的事情(在第一个 AJAX 请求发生重定向时,所有后续 AJAX 请求都返回 HTTP 403)。对于 session 超时的 AJAX 请求,我不想重定向到登录页面。

有什么想法吗?

<beans:bean id="authenticationEntryPoint"  class="mojo.ocs.web.AjaxAwareAuthenticationEntryPoint">
<beans:constructor-arg name="loginUrl" value="/login"/>
</beans:bean>
<!-- ENTRY POINT REF IMPLEMENTATION -->
<http auto-config="true" use-expressions="true" access-denied-page="/accessdenied" entry-point-ref="authenticationEntryPoint">
<intercept-url pattern="/login" access="isAnonymous()"/>
<intercept-url pattern="/loginfailed" access="isAnonymous()"/>
<intercept-url pattern="/welcome" access="isAuthenticated()" />
<intercept-url pattern="/" access="isAuthenticated()" />
<intercept-url pattern="/private_res/**" access="isAuthenticated()" />
<intercept-url pattern="/tne/**" access="isAuthenticated()" />
<intercept-url pattern="/team_reports/**" access="isAuthenticated()" />
<form-login login-page="/login" default-target-url="/welcome" always-use-default-target="true" authentication-failure-url="/loginfailed" />
<logout delete-cookies="JSESSIONID" logout-success-url="/logout" invalidate-session="true"/>
<session-management invalid-session-url="/login" />
</http>

这里是 LoginAuthenticationEntryPoint:

public class AjaxAwareAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint     
{
public AjaxAwareAuthenticationEntryPoint(String loginUrl) {
super(loginUrl);
}

@Override
public void commence(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException authException)
throws IOException, ServletException {
String ajaxHeader = ((HttpServletRequest) request).getHeader("X-Requested-With");
boolean isAjax = "XMLHttpRequest".equals(ajaxHeader);
if (isAjax) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Ajax REquest Denied (Session Expired)");
} else {
super.commence(request, response, authException);
}
}
}

最佳答案

确认这与 Spring Boot 与 Spring 安全性结合以编程方式设置安全性也完全正常,无需任何必需的 XML,例如:

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin**").hasRole("ADMIN")
// everything else
.anyRequest().fullyAuthenticated()
.and()
.exceptionHandling().authenticationEntryPoint(new AjaxAwareAuthenticationEntryPoint("/login"));
}

关于ajax - Spring 安全性 + Ajax session 超时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com