繁体   English   中英

带有response.sendRedirect的404

[英]404 with response.sendRedirect

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

  1. 如果客户未登录,则应用程序会将客户重定向到登录页面。
  2. 成功登录后,应用程序会将客户重定向到同一页面,从该页面将他们重定向到登录页面

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

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

这里使用的RedirectionStrategy是DefaultRedirectStrategy ,一切正常。 现在,应用程序已部署在Pre Production服务器上,现在似乎无法正常工作,并且出现404错误。

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

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

我的应用程序当前的Pre-Prod urs是prepd-www.mysite.com因此当sendredirect prepd-www.mysite.com时,网页URL已更改为prepd-www.mysite.com/prepd-www.mysite.com

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

我已经在所有本地计算机上以及在我们的质量检查中都进行了尝试,但是一切工作正常。

目前针对发生这种情况的环境的设置

  1. 我们有4个应用服务器
  2. 我们有一个负载平衡器,可将流量重定向到其中一台应用程序服务器。

您是在生产前期的tomcat还是其他应用程序服务器中使用的?通常,如果您的战争正在调用foo并且您对tomcat进行了提交,则这场战争的路径是

   http://localhost:8080/foo/ 

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

只是一个大胆的猜测,因为您无法提供反向代理配置,也无法提供预先生产和开发中使用的确切URL。

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

但是,如果现在处于preprod中,则servlet上下文不再是根目录,而是说/myApp 曾经由apache反向代理翻译 ,当您重定向时,您将获得/myApp/myApp的URL,该URL可以翻译回您提供的URL。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM