我的情况是,我们有两个单独的主页用于登录和未签名的用户。但我们正在尝试使用cloudfront缓存这些页面。主页的一部分是动态的,我们正在尝试使用Ajax / jquery调用restful服务并在模板javascript中设置输出值来设置它。这个javascript是在加载签名的JSP时执行的。
我相信登录后会调用SecurityContextHolder.getContext()。setAuthentication()。
在Ajax调用的Restful webservice中,我试图让Loggedin用户使用 SecurityContextHolder.getContext()。getAuthentication()。getPrincipal()。但是getAuthentication()返回null。
我的web.xml如下
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/classes/persistence-context.xml
WEB-INF/xyz-servlet.xml
WEB-INF/classes/environment-context.xml
WEB-INF/classes/transactional-context.xml
WEB-INF/classes/spring-security-context.xml
WEB-INF/classes/services-context.xml
WEB-INF/classes/aop-context.xml
</param-value>
</context-param>
<!-- Spring Security Filter -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
在spring-security-context.xml中,我有以下值
<http use-expressions="true" auto-config="false" create-session="never" entry-point-ref="authenticationProcessingFilterEntryPoint">
<access-denied-handler ref="exceptionResolver" />
<intercept-url pattern="/xyz/myaccount/**" access="hasRole('FRONT_END_USER')" />
<intercept-url pattern="/xyz/form-clickref*" access="hasRole('FRONT_END_USER')" />
<intercept-url pattern="/**" filters="none" />
<form-login login-page="/xyz/login" login-processing-url="/xyz/j_spring_security_check"
authentication-failure-handler-ref="xyzAuthenticationFailureHandler"
authentication-success-handler-ref="simpleUrlAuthenticationSuccessHandler" />
<logout logout-url="/xyz/logout" invalidate-session="true" success-handler-ref="logoutSuccessHandler" />
<remember-me services-ref="rememberMeServices" key="fe2c667b-d39e-4277-ba66-709ca0bee944" />
<anonymous enabled="false" />
<request-cache ref="nullRequestCache" />
<session-management session-fixation-protection="none" />
</http>
答案 0 :(得分:1)
我猜,应用程序在您的AJAX请求中失去了对用户http会话的跟踪。
通常有两种(三种)方式来跟踪用户的会话:
我猜你的AJAX请求没有发送Cookie也没有发送JSessionId请求参数。
要理解这个问题,我会使用一些工具/ Firefoxplugin(FireBug,Http Live Headers,...)来查看发送给服务器的REQUEST。我会检查“正常”请求,看看我是否可以找到JSessionID(url查询参数或会话)。然后我会看看AJAX请求,并寻找相同的信息。
如果正常请求中有JSessionId,但AJAX请求中没有,那么我的猜测是正确的。然后您需要做的就是向AJAX请求提供此信息。 祝你好运