当前位置: 首页 > 知识库问答 >
问题:

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

郭乐湛
2023-03-14

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

裴俊豪
2023-03-14

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

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

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

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

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

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

 类似资料:
  • 这个问题是ajax Spring mvc中返回模型和视图的后续 因为唯一的答案是我们需要从控制器返回json,而不是Model AndView。所以问题是 如何返回ModelAndView 如何呈现页面:- 它必须在ajax调用的成功部分处理吗 或者Spring Controller将像在Spring MVC中那样返回页面 更新1:如前所述,我尝试了示例。这是我的代码。 在上述控制器方法中,我可以

  • 我只有配置和Spring Security性 登录实现UserDetailsService loginUser用于会话信息 谢谢你阅读。

  • 问题内容: 加载页面后,我将对php脚本执行Ajax调用,这将更新服务器。但是,此脚本有时可能需要一分钟才能完成,并且在脚本运行时,我无法执行我需要处理的其他Ajax调用- 即第一个Ajax调用不应中断其他Ajax调用。任何想法如何做到这一点? 首次Ajax通话: 第二个Ajax调用(用户触发的调用): 问题答案: 腺苷的上述评论是正确的。 “在PHP中,一次只能在一个会话上运行一个脚本,以免覆盖

  • 为了测试AngularJS,我从http://AngularJS.org/home页面上的“wire up a backend”示例中提取了以下代码。当视图是本地的时,一切都按预期工作,但当我将视图移动到另一个URL时,我得到的是403。请参阅此处的jsbin示例: http://jsbin.com/olavok/1/edit 选项...403(禁止)Angular.min.js:99 XMLHt

  • 问题内容: 我正在尝试实现类似于this或this的东西。 我创建了一个用户控件,一个Web服务和一个Web方法来返回控件的呈现的html,并通过jQuery执行ajax调用。 一切正常,但是如果我在用户控件中放置了使用相对路径的内容(在我的情况下为带有NavigateUrl =“〜/ mypage.aspx”的HyperLink),则相对路径的解析在我的开发服务器中将失败。 我期望: http:

  • 我已经做了一些关于CORS如何工作的研究,但老实说,我是开发这一特定方面的新手。 我有一个API,我想向任何使用有效API密钥的人公开它。这里的安全级别是最低的——API密钥的目的只是帮助识别发出请求的人。请求的信息是公开的,所以我不太关心安全性。 代码的工作方式是,当进行API调用时,它验证API密钥,如果密钥有效并且与所请求的信息匹配,则API返回相关信息。 我目前正在使用“*”作为我的控制器

  • 问题内容: 我有一个标准的javascript ajax调用,其中将data:设置为json数据。 我试图在php中获取数据,这是行不通的。 但是,可行。 我想知道这可能是我的框架或诸如此类的无法正常工作的东西吗?还是还有其他我可以用来获取数据的东西? 编辑: 因此,框架YII和扩展Restfullyii具有使用一种方法获取其数据的方法return json_decode(file_get_con

  • 问题内容: 我了解AJAX跨域策略。因此,我不能仅通过ajax HTTP请求调用“ http://www.google.com ”,并将结果显示在我的网站上。 我使用dataType“ jsonp”进行了尝试,这实际上可以工作,但是出现语法错误(显然是因为接收到的数据不是JSON格式的) 还有其他可能性可以从外部域接收/显示数据吗?iFrame是否遵循相同的政策? 问题答案: 使用AJAX获取跨域