提问者:小点点

SecurityContextHolder.getContext().getAuthentication()对于Ajax调用为空


我遇到一种情况,即我们为登录用户和非登录用户提供了两个单独的主页。但是我们正在尝试使用 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>

共1个答案

匿名用户

我猜,应用程序在AJAX请求中失去了对用户http会话的跟踪。

通常,有两种(三)种方法可以跟踪用户的会话:

    < li >使用JSessionID作为url查询参数 < li >使用包含JSessionID的cookie < li >(混合模式:服务器决定使用上述两种技术中的哪一种)

我猜您的AJAX请求既没有发送Cookie,也没有发送JSessionId请求参数。

为了理解这个问题,我会使用一些工具/Firefoxplugin (FireBug,Http Live Headers,...)来查看发送到服务器的请求。我将检查“普通”请求,看看是否能找到JSessionID (url查询参数,或会话)。然后我会查看AJAX请求,并寻找相同的信息。

如果在正常请求中有一个JSessionId,但在AJAX请求中没有,那么我的猜测是正确的。然后,您需要做的就是将此信息也发送到 AJAX 请求。祝你好运