gpt4 book ai didi

spring - 保持 Spring Security session 超时的区域设置

转载 作者:行者123 更新时间:2023-12-02 05:43:21 27 4
gpt4 key购买 nike

我正在使用 Spring Security 3.0.2 并且我有这个配置

    <security:form-login
login-processing-url="/resources/j_spring_security_check"
login-page="/login"
authentication-failure-handler-ref="authErrorHandler" authentication-success-handler-ref="authCorrectHandler" />
<security:logout logout-success-url="/index.jsp" invalidate-session="false" />
<security:remember-me />
<security:session-management invalid-session-url="/login/sessionExpired" >
<security:concurrency-control max-sessions="1"
error-if-maximum-exceeded="true" />
</security:session-management>

当我使用特定区域设置登录时,一切都很顺利,但是当 session 过期时,Spring Security 会清除 session 并默认使用区域设置创建新的匿名 session (并按预期转到登录页面)。结果是用户区域设置丢失。

在 Spring Security 3.0.2 中, session 过期时如何保留用户区域设置?

我使用 localeChangeInterceptor 来设置区域设置,如下所示:

    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language" />
</bean>

和 SessionLocaleResolver 作为区域设置解析器:

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="es" />
</bean>
<小时/>

编辑 - 解决了我的需求

我最终解决了这个问题,在我自己的LocaleChangeInterceptor中设置了一个cookie,它从HandlerInterceptorAdapter扩展而来,并将其写入preHandle方法:

     LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException("No LocaleResolver found.");
}
Cookie mylang = new Cookie("mylang", locale.getLanguage() + "_" + locale.getCountry());
mylang.setMaxAge(86400);
response.addCookie(mylang);

localeResolver.setLocale(request, response, locale);

然后在 /sessionExpired 控制点中,我获取 cookie 值:

public String sessionExpired(HttpServletRequest request, HttpServletResponse response, Model model, 
@CookieValue(value = "mylang", defaultValue = "es_ES") String myLang) throws Exception {
model.addAttribute("mylang", myLang);
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);

StringTokenizer st = new StringTokenizer(myLang, "_");

String language = "";
String country = "";

try {
language = (String) st.nextElement();
country = (String) st.nextElement();
} catch (Exception e) {
throw new Exception("Error locale");
}

Locale locale = new Locale(language, country);
localeResolver.setLocale(request, response, locale);
return "sessionExpired";

在这种情况下不需要使用数据库作为临时存储。

最佳答案

从逻辑上讲,您似乎无法使用 session 来跟踪区域设置。使用请求参数 language 设置区域设置这将随着 session 被清除。创建新 session 时,区域设置默认为 es正如您的 localeResolver 所给出的。我想到的一种方法是将用户首选项存储在数据库中,并在后续登录时从那里检索

也按照@M的建议。迪努姆:

如果您同意 cookie,请使用 CookieLocaleResolver它将选择保留在 cookie 中。否则实现您自己的LocaleResolver它从数据库存储/检索。

关于spring - 保持 Spring Security session 超时的区域设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24327245/

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