404 与 response.sendRedirect

Posted

技术标签:

【中文标题】404 与 response.sendRedirect【英文标题】:404 with response.sendRedirect 【发布时间】:2015-01-19 08:45:43 【问题描述】:

我正在为我的应用程序使用 spring 安全登录机制并测试了一切。一切正常。我有以下用例

    如果客户未登录,应用程序会将客户重定向到登录页面。 成功登录后,应用程序会将客户重定向回他们被重定向到登录页面的同一页面

这是用于将用户重定向到其原始位置的 Java 代码

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

这里使用的重定向策略是DefaultRedirectStrategy,一切正常。应用程序现在部署在预生产服务器上,现在这似乎不起作用,我收到 404 错误。

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

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

我的应用程序当前的 Pre-Prod urs 是 prepd-www.mysite.com,所以当 sendredirect 生效时,网页 URL 将更改为 prepd-www.mysite.com/prepd-www.mysite.com

我不确定是什么导致了这个问题。是因为代理服务器设置吗? 任何人都可以建议我有关此问题的可能根本原因吗?

我已经在所有本地机器上进行了尝试,并且在我们的 QA 上也进行了很好的测试,但一切都运行良好。

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

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

【问题讨论】:

你在你的 pre-prod 服务器中使用了一些 http 服务器(例如 apache)吗?如果您说在本地它工作正常,那么可能是一些配置问题。 @AleksandrM:是的,使用 Apache 作为 HTTP 服务器,即使我怀疑这是配置问题 这看起来像是 apache 反向代理的错误配置。你能显示代理的配置吗? 您的所有应用服务器是否可以相互访问。 @UmeshAwasthi @UmeshAwasthi - 请提供您的 Spring Security 配置,尤其是 <form-login> 元素。另外,HomePageController 的“/”处理程序中发生了什么? 【参考方案1】:

只是一个疯狂的猜测,因为您无法提供反向代理配置,也无法提供 pre prod 和 developmentpement 中使用的确切 URL。

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

但是如果现在在 preprod 中,servlet 上下文不再是 root,而是说 /myApp 一旦被 apache 反向代理翻译,当你重定向时,你会得到一个 /myApp/myApp 的 URL,这可能是翻译回你给的东西。

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

【讨论】:

谢谢!!这就是我所做的一个疯狂的猜测,希望这会奏效。我的问题是服务器不在我们的控制之下,它们对我们来说就像黑匣子,任何信息请求似乎都被 IT 团队弄丢了:( @UmeshAwasthi :只是一个建议,但您应该在开发环境中使用非空上下文路径来尽早发现此类问题。 我试过了,但它似乎不起作用,对我来说,context 总是以 empty 出现,而​​ URL 总是以 http://site-la-www.mysite.com/ 出现 @UmeshAwasthi 独立于所有源代码(包括配置)的上下文部分。它仅由部署步骤设置。你的开发工具是什么? 您能否更具体地说明您想了解的有关开发工具的内容?【参考方案2】:

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

【讨论】:

抱歉问这个问题,但对设置不熟悉,如何使用 ssh 绕过 apache? 如果您可以访问 tomcat 端口,则可以使用 putty 隧道到 tomcat 端口并直接访问,而无需本地上的 apacche。检查这个腻子隧道。 ehow.com/how_2036605_create-ssh-putty.html#page=7【参考方案3】:

你是在使用 preproduction 的 tomcat 还是其他应用服务器?,通常如果你的 war 调用 foo 并且你提交给 tomcat,那么这个 war 的路径是

   http://localhost:8080/foo/ 

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

【讨论】:

以上是关于404 与 response.sendRedirect的主要内容,如果未能解决你的问题,请参考以下文章

缺少目录索引时的 404 与 403

phpmyadmin 错误 404.0 与 xampp

ReactJS 和 Express 与 Axios 返回 404

方法 GET 与 Axios 给出错误 404。ReactJS

Golang Gorilla mux 与 http.FileServer 返回 404

如何将404页面与php页面加载脚本连接起来