我正在使用Weblogic 10.3.5。我使用Struts(1.x)映射为默认servlet的大型遗留企业应用程序。
要启动一些遗留卷积:每个企业客户都有一个“订户ID”,除了用户名和密码之外,用户还必须在登录时提供这些“订户ID”。订户ID是数字,并且始终至少有四位数,通常为五位。如果你去mysite.com/,你会看到一个三字段登录页面:订户ID,用户名和密码。
我们最大的企业客户不喜欢这样,很多年前我们引入了皮肤登录页面:转到mysite.com/12345,其中12345是您的订户ID。我们将预先填充并隐藏订户ID字段,并使用企业客户的徽标和配色方案为登录页面设置外观。
多年以后,我们有100多个servlet映射,每个用户一个。每个新客户都需要软件部署来添加servlet映射,因此我们的实施团队受到开发团队部署计划的限制,而这反过来又受到我们大型企业客户需要预算时间进行用户验收测试的限制。
为了解决这个问题,我们更改了URL:mysite.com/login/12345,其中/ login / *映射到一个接受任何订阅者ID的servlet。我们保留了旧的servlet映射,以便现有客户不必更改URL,但这留下了两个烦恼:
我们有一个预先存在的自定义404页面,在web.xml中正确定义,并且表现完全符合预期。我使用以下代码更新了它,位于顶部:
<%
if (request.getRequestURI().matches("^/[\\d]{4,}$")) {
// probably someone trying to log in with the old-style URL
response.sendRedirect(String.format("/login%s", request.getRequestURI()));
return;
}
%>
这就像一个魅力,直到我注意到一个奇怪的地方:
我第一次尝试访问应该导致404的URL,但由于它与正则表达式匹配而被重定向,因此它不会重定向。使用我的调试器,我已经确定原因是request.getRequestURI()返回“/errors/404error.jsp”而不是像我期望的那样“/ 12345”,导致正则表达式不匹配,我们的正常404页面正在服务于用户。
我的第一个想法是有些东西告诉浏览器重定向到404页面,但Chrome开发者工具“网络”标签表明情况并非如此。
第一次失败后,我的更改会在以后的每个时间运行,直到应用程序服务器重新启动。
如果我先点击/ login / 12345它会加载正常。任何后续尝试命中/ 12345都可以正常工作,所以看起来它可能与登录servlet在第一次请求之后没有完全初始化有关。 Weblogic是封闭源代码,因此我无法深入了解正在发生的事情。
我知道我正在做的事情很奇怪;我对其他方法持开放态度。但问题是:第一次尝试时导致不同请求URI的原因是什么,我该如何解决?我已经在调试器中搜索了HttpServletRequest对象,但我没有看到任何真实请求URI的指示。