我遇到一种情况,即我们为登录用户和非登录用户提供了两个单独的主页。但是我们正在尝试使用 cloudfront 缓存这些页面。主页的一部分是动态的,我们尝试使用 Ajax/jquery 调用 restful 服务并在模板 javascript 中设置输出值来设置它。此 JavaScript 在加载已登录的 JSP 时执行。
我相信securitycontextholder . get context()。登录后正在调用setAuthentication()。
在Ajax调用的Restful webservice中,我尝试使用security context holder . get context()让用户登录。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>
我猜,应用程序在AJAX请求中失去了对用户http会话的跟踪。
通常,有两种(三)种方法可以跟踪用户的会话:
我猜您的AJAX请求既没有发送Cookie,也没有发送JSessionId请求参数。
为了理解这个问题,我会使用一些工具/Firefoxplugin (FireBug,Http Live Headers,...)来查看发送到服务器的请求。我将检查“普通”请求,看看是否能找到JSessionID (url查询参数,或会话)。然后我会查看AJAX请求,并寻找相同的信息。
如果在正常请求中有一个JSessionId,但在AJAX请求中没有,那么我的猜测是正确的。然后,您需要做的就是将此信息也发送到 AJAX 请求。祝你好运