Java 在Spring安全登录期间添加cookie

Java 在Spring安全登录期间添加cookie,java,spring,spring-mvc,cookies,spring-security,Java,Spring,Spring Mvc,Cookies,Spring Security,我有一个带有Spring Security的web项目,我尝试在处理身份验证成功的方法中保存cookie。但是,当我查看浏览器的cookies时,只会显示JSESSIONID,当我查看Spring重定向到的servlet中的request.getCookies()时,也会出现同样的情况 我已尝试将cookie保存在应用程序的一个servlet中,并且cookie保存正确,因此可能Spring Security会清除响应。你知道吗 一种解决方法是在会话中保存它,然后获取它并将cookie保存在登录

我有一个带有Spring Security的web项目,我尝试在处理身份验证成功的方法中保存cookie。但是,当我查看浏览器的cookies时,只会显示JSESSIONID,当我查看Spring重定向到的servlet中的request.getCookies()时,也会出现同样的情况

我已尝试将cookie保存在应用程序的一个servlet中,并且cookie保存正确,因此可能Spring Security会清除响应。你知道吗

一种解决方法是在会话中保存它,然后获取它并将cookie保存在登录重定向到的servlet上。另一个方法是使用类似javascript的脚本保存cookie。但我不喜欢这些解决方案。提前谢谢

以下是相关代码:

public class RoleBasedAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler implements
    AuthenticationSuccessHandler {
    ...
    // save a cookie with the selected language
    Map<String, String[]> parameterMap = request.getParameterMap();
    if (parameterMap.containsKey("language")) {
        saveCookie("language", parameterMap.get("language")[0], response);
    }
}

public static void saveCookie(String cookieName, String value, HttpServletResponse response) {
    Cookie cookie = new Cookie(cookieName, value);
    //maxAge is one month: 30*24*60*60 
    cookie.setMaxAge(2592000);
    cookie.setDomain("projectName");
    cookie.setPath("/");
    response.addCookie(cookie);
    }
}

<security:http auto-config="false" ...>
    <security:form-login login-page="/login.do" authentication-success-handler-ref="redirectRoleStrategy" .../>
    ...
</security:http>

<bean id="redirectRoleStrategy" class="com.companyName.security.RoleBasedAuthenticationSuccessHandler">
    <beans:property name="roleUrlMap">
        <beans:map>
            <beans:entry key="ROLE_ADMIN" value="/privat/application.do"/>
            ...
        </beans:map>
    </beans:property>
</bean>
公共类RoleBaseAuthenticationSuccessHandler扩展了SavedRequestAwareAuthenticationSuccessHandler实现
AuthenticationSuccessHandler{
...
//使用所选语言保存cookie
Map parameterMap=request.getParameterMap();
if(参数映射为containsKey(“语言”)){
saveCookie(“语言”,参数map.get(“语言”)[0],响应);
}
}
公共静态void saveCookie(字符串cookieName、字符串值、HttpServletResponse){
Cookie Cookie=新Cookie(cookieName,值);
//最大值为一个月:30*24*60*60
cookie.setMaxAge(2592000);
cookie.setDomain(“项目名称”);
cookie.setPath(“/”);
addCookie(cookie);
}
}
...
...

尝试在if子句之外调用一些harcoded值,看看它是否有效:

saveCookie("language", "en", response);
此外,作为一项测试,请尝试最初不设置cookie域和路径:

Cookie cookie = new Cookie(cookieName, value);
//maxAge is one month: 30*24*60*60 
cookie.setMaxAge(2592000);
//cookie.setDomain("projectName");
//cookie.setPath("/");
response.addCookie(cookie);

应该可以从身份验证成功处理程序中设置cookie,这应该正常工作。

您是在RoleBaseAuthenticationSuccessHandler中调用super之前还是之后设置cookie

 super.onAuthenticationSuccess(request, response, authentication);

您必须在调用super之前设置cookie,因为超类中的逻辑将发送重定向,从而阻止您更新HttpServletResponse的内容。

非常感谢@vschafer,您的解决方案解决了问题!我没有想到这一点,因为我的代码是在重定向之后执行的。很高兴它对您有效,请通过单击答案旁边的复选标记将其从空心切换为绿色来接受答案。@VladimírSchäfer是否可能在java端实现spring security重定向
url
设置cookie