Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring安全性targetUrlParameter不重定向_Java_Spring Security - Fatal编程技术网

Java Spring安全性targetUrlParameter不重定向

Java Spring安全性targetUrlParameter不重定向,java,spring-security,Java,Spring Security,我正在尝试将用户重定向回他们单击登录链接的页面。(对于未经身份验证的用户,页面是只读的,但是对于登录的用户,页面是可写的。)如何在用户登录后将其重定向回其来源 我将通过以下链接发送给用户登录页面:/spring\u security\u login?redirect=/item5。登录后,我希望用户被重定向到/item5页面。但是,它们总是被重定向到/页面 以下是我正在使用的配置: <http use-expressions="true"> <intercept-url

我正在尝试将用户重定向回他们单击登录链接的页面。(对于未经身份验证的用户,页面是只读的,但是对于登录的用户,页面是可写的。)如何在用户登录后将其重定向回其来源

我将通过以下链接发送给用户登录页面:
/spring\u security\u login?redirect=/item5
。登录后,我希望用户被重定向到
/item5
页面。但是,它们总是被重定向到
/
页面

以下是我正在使用的配置:

<http use-expressions="true">
    <intercept-url pattern="/**" access="permitAll" />
    <form-login authentication-success-handler-ref="simpleUrlAuthenticationSuccessHandler"/>
</http>
<beans:bean id="simpleUrlAuthenticationSuccessHandler"
    class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
    <beans:property name="defaultTargetUrl" value="/"/>
    <beans:property name="targetUrlParameter" value="redirect"/>
</beans:bean>


似乎
targetUrlParameter
未按预期拾取。我之所以使用Spring Security 3.1.4,是因为这一行:

<beans:property name="defaultTargetUrl" value="/"/>


请删除该行,然后重试。

使用时将应用以下规则:

  • 如果alwaysUseDefaultTargetUrl属性设置为true,则defaultTargetUrl属性将用于目标
  • 如果在请求中设置了与targetUrlParameter值匹配的参数,则该值将用作目标。默认情况下,该值为“spring安全重定向”
  • 如果设置了useReferer属性,则将使用“Referer”HTTP头值(如果存在)
  • 作为回退选项,将使用defaultTargetUrl值

根据您的配置,这应该可以工作。我猜您在登录表单中发送
POST
请求时没有传播
referer
。通常,您应该在登录页面的隐藏字段中写入
referer
值,以便
referer
参数被传输到
spring\u security\u login
以下通用解决方案可用于常规登录、spring社交登录或大多数其他spring安全过滤器

在SpringMVC控制器中,加载只读页面时,如果用户尚未登录,请在会话中保存该页面的路径。在XML配置中,设置默认的目标url。例如:

在Spring MVC控制器中,重定向方法应该从会话中读取路径并返回
重定向:


因此,在用户登录后,它们将被发送到
/redirect
页面,这将立即将他们重定向回上次访问的页面。

SimpleLauthenAuthenticationSuccessHandler更改为SavedRequestStataWareAuthenticationSuccessHandler,并感到高兴。

使用
SavedRequestStataWareAuthenticationSuccessHandler
而不是
SimpleRuthenticationSuccessHandler

即使页面的url是在浏览器上键入的,在这种情况下,
referer
不会被捕获,
SavedRequestAwareAuthenticationSuccessHandler
也会使用
ExceptionAslationFilter
捕获的前一个url


阅读,劳伦特已经解释了这一点。您可以在spring中传递useReferer参数。适用于SavedRequestStatawareAuthenticationSuccessHandler和SimpleRulAuthenticationSuccessHandler

以下是您修改后的spring逻辑:

<http use-expressions="true">
    <intercept-url pattern="/**" access="permitAll" />
    <form-login authentication-success-handler-ref="simpleUrlAuthenticationSuccessHandler"/>
</http>

<beans:bean id="simpleUrlAuthenticationSuccessHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
     <beans:property name="defaultTargetUrl" value="/"/>
     <beans:property name="targetUrlParameter" value="redirect"/>
     <beans:property name="useReferer" value="true"/>
</beans:bean>


我正在尝试使用Spring Security提供的默认登录页面,因此我不会在登录页面上手动设置或传播任何内容。我不了解如何设置
referer
,因为它似乎不能简单地设置为
/spring\u security\u login?referer=somePage
,除了自己呈现登录页面,我看不到其他方法(并注意
referer
参数。大多数时候,您都需要这个,因为Spring的默认登录页很难看。我删除了那一行,但它没有改变行为。登录页总是重定向到
/
,即使没有那一行。抱歉,我不知道。关于referer的好信息。我不会依赖它。Spring将在requestCache中捕获原始请求信息。遇到与OP类似问题的任何人都应该使用调试器并逐步执行SavedRequestStataWareAuthenticationSuccessHandler Spring代码。很容易理解他们如何重定向到用户的原始预期页面。如果输入错误,应该是SimpleRuuthenticationSuccess山德勒