我正在使用 Weblogic 10.3.5。我使用映射为默认 servlet 的 Struts (1.x) 处理大型遗留企业应用程序。
背景
开始进行一些遗留卷积:每个企业客户都有一个“订阅者 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,但这留下了两个烦恼:
- web.xml 中有几百行代码
- 作为开发人员或 QA,在知道使用哪个 URL 登录之前,必须知道这是旧订阅者还是新订阅者,这很烦人。尝试对新订阅者使用旧方法?你会得到一个 404 页面。
这就是我所做的
我们有一个预先存在的自定义 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 的指示。