在Spring Security登录期间添加cookie

时间:2014-04-16 19:03:52

标签: java spring spring-mvc cookies spring-security

我有一个使用Spring Security的Web项目,我尝试在处理身份验证成功的方法中保存cookie。但是,当我查看浏览器的cookie时,只显示JSESSIONID,当我在Spring重定向到的servlet上查看request.getCookies()时,会发生相同的情况。

我试图将cookie保存在其中一个应用程序的servlet中,并且cookie已正确保存,因此Spring Security可能会清除响应。你有什么想法吗?

一种解决方法是将其保存在Session中,然后获取它并将cookie保存在登录重定向到的servlet上。另一个是用this这样的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>

2 个答案:

答案 0 :(得分:10)

您是否在RoleBasedAuthenticationSuccessHandler中调用super之前或之后设置了cookie?

 super.onAuthenticationSuccess(request, response, authentication);

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

答案 1 :(得分:0)

尝试在if子句之外调用一些带编码的值,只是为了查看它是否有效:

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,这应该可以正常工作。