404 with response.sendRedirect

时间:2014-11-21 08:53:11

标签: java spring java-ee spring-security

我正在为我的应用程序使用spring security登录机制并测试了所有内容。这些工作正常。我有以下用例

  1. 如果客户未登录,则应用程序会将客户重定向到登录页面。
  2. 成功登录后,应用程序会将客户重定向到从重定向到登录页面的同一页面
  3. 这是用于将用户重定向到其原始位置的Java代码

    final SavedRequest savedRequest = this.requestCache.getRequest(request, response);
    targetUrl = savedRequest.getRedirectUrl();
    getRedirectStrategy().sendRedirect(request, response, targetUrl);
    

    这里使用的RedirectionStrategy是DefaultRedirectStrategy,事情进展顺利。应用程序现在部署在预生产服务器上,现在看起来不起作用,我收到404错误。

    当客户被重定向到主页时,targetUrl将以" /"出现,我有一个以此映射命名的Spring控制器

    @RequestMapping("/")
    public class HomePageController{  // home page code }
    

    我的应用程序目前的Pre-Prod urs为prepd-www.mysite.com因此当sendredirect开始行动时,网页网址将更改为prepd-www.mysite.com/prepd-www.mysite.com

    我不确定导致此问题的原因。是因为代理服务器设置? 任何人都可以向我提出这个问题可能的根本原因吗?

    我已经在所有本地机器和我们的QA上尝试过了,但一切都运行得很好。

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

    1. 我们有4个app server
    2. 我们有一个负载均衡器,可以将流量重定向到其中一个应用服务器。

3 个答案:

答案 0 :(得分:1)

您是在预生产tomcat或其他应用服务器中使用吗?通常如果您的战争是调用foo并且您对tomcat的提交,那么这场战争的路径就是

   http://localhost:8080/foo/ 

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

答案 1 :(得分:1)

只是一个疯狂的猜测,因为你无法提供反向代理配置,也没有提供前期和开发中使用的确切URL。

您说您正在使用Spring安全性中的DefaultRedirectStrategy。此策略有一个选项(contextRelative),它将ServletContext路径添加到URL之前。如果在您的开发系统中使用了根上下文,那么如果您正在访问主页(例如):http://localhost:8080/,则serlet上下文为空。

但是如果现在在preprod中,servlet上下文不再是root,而是说/myApp 一旦由apache反向代理翻译,当你重定向时,你得到一个{{1}的URL这可以转化为你给的东西。

您可以尝试控制/myApp/myAppcontextRelativetrue,如果是,则设置为false,并控制是否重定向到绝对或相对URL。

答案 2 :(得分:1)

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