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的主要内容,如果未能解决你的问题,请参考以下文章
ReactJS 和 Express 与 Axios 返回 404
方法 GET 与 Axios 给出错误 404。ReactJS