Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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 404带有response.sendRedirect_Java_Spring_Jakarta Ee_Spring Security - Fatal编程技术网

Java 404带有response.sendRedirect

Java 404带有response.sendRedirect,java,spring,jakarta-ee,spring-security,Java,Spring,Jakarta Ee,Spring Security,我正在为我的应用程序使用spring安全登录机制,并测试了所有内容 如果客户未登录,应用程序会将客户重定向到登录页面 成功登录后,应用程序会将客户重定向回原来重定向到登录页面的页面 这是用于将用户重定向到其原始位置的Java代码 final SavedRequest savedRequest = this.requestCache.getRequest(request, response); targetUrl = savedRequest.getRedirectUrl(); getRedire

我正在为我的应用程序使用spring安全登录机制,并测试了所有内容

  • 如果客户未登录,应用程序会将客户重定向到登录页面
  • 成功登录后,应用程序会将客户重定向回原来重定向到登录页面的页面
  • 这是用于将用户重定向到其原始位置的Java代码

    final SavedRequest savedRequest = this.requestCache.getRequest(request, response);
    targetUrl = savedRequest.getRedirectUrl();
    getRedirectStrategy().sendRedirect(request, response, targetUrl);
    
    这里使用的重定向策略是,一切正常。应用程序现在部署在预生产服务器上,现在这似乎不起作用,我得到404错误

    当客户被重定向到主页时,
    targetUrl
    显示为“/”,我有一个名为Spring的控制器

    @RequestMapping("/")
    public class HomePageController{  // home page code }
    
    我的应用程序当前的预产品是
    prepd-www.mysite.com
    ,因此当sendredirect开始运行时,网页URL将更改为
    prepd-www.mysite.com/prepd-www.mysite.com

    我不确定是什么导致了这个问题。是因为代理服务器设置吗? 有人能告诉我这个问题可能的根本原因吗

    我已经在所有本地机器上试过了,在我们的QA上也试过了,但一切都很好

    发生这种情况的环境的当前设置为

  • 我们有4个应用服务器
  • 我们有一个负载均衡器,它将流量重定向到一个应用服务器

  • 您是否在试生产tomcat或其他应用程序服务器中使用?通常,如果您的war正在调用foo并提交给tomcat,则此war的路径是

       http://localhost:8080/foo/ 
    

    因此,如果您使用的是servlet,您需要在web.xml中指定主路径为foo/*

    这只是一个粗略的猜测,因为您无法给出反向代理配置,也无法给出预生产和开发中使用的确切URL

    您说您正在使用Spring security的
    DefaultRedirectStrategy
    。此策略有一个选项(contextRelative),它在URL的ServletContext路径前面加上前缀。如果您在开发系统中使用的是根上下文,也就是说您访问的主页位于(例如):
    http://localhost:8080/
    serlet上下文为空

    但是如果现在在prepod中,servlet上下文不再是root,而是说,一旦被apache反向代理翻译,servlet上下文就是
    /myApp
    ,当你重定向时,你会得到一个
    /myApp/myApp
    的URL,它可以被翻译回你给出的内容


    您可以尝试控制
    DefaultRedirectStrategy
    中的
    contextRelative
    是否为
    true
    ,如果是,则可以将if设置为false,还可以控制是否重定向到绝对或相对URL。

    如果在前面使用apache,请检查apache配置的重写规则和重定向规则。最好的方法是通过ssh隧道直接连接到应用服务器(跳过apache)并进行测试。如果它正常工作,这意味着您的应用程序配置很好,需要在apache中进行修复。

    您是否在pre-prod服务器中使用了一些http服务器(例如apache)?如果您说它在本地工作正常,那么可能是一些配置问题。@AleksandrM:是的,使用Apache作为HTTP服务器,即使我怀疑这是配置问题。这看起来像是Apache反向代理的错误配置。您可以显示代理的配置吗?您的所有应用程序服务器都可以相互访问吗@UmeshAwasthi@UmeshAwasthi-请提供您的Spring安全配置,特别是
    元素。另外,您的
    主页控制器的“/”处理程序中发生了什么?谢谢!!这就是我所做的胡乱猜测,希望这能奏效。我的问题是,服务器不在我们的控制之下,它们对我们来说就像一个黑匣子,任何信息请求似乎都会丢失给IT团队:(@Umeshawashi:这只是一个建议,但是你应该在开发中使用一个非空的上下文路径来尽早发现类似的问题。我尝试了这个方法,但似乎不起作用,对我来说,
    上下文总是以
    空的形式出现,URL总是以
    的形式出现http://site-la-www.mysite.com/
    @umeshawashi在独立于所有源代码(包括配置)。它仅由部署步骤设置。您的开发工具是什么?您能否更具体地了解有关开发工具的信息?很抱歉问这个问题,但由于不熟悉设置内容,我如何使用ssh绕过apache?如果您可以访问tomcat端口,您可以使用putty隧道到tomcat端口并直接访问没有apacche在你的地方。检查这个油灰隧道。