我有一个网络应用程序,我想扩展它以支持具有新 URL 的多种语言。例如,www.example.com/home.do 保持英语,但 www.example.com/es/home.do 是西班牙语。我的第一个想法是创建一个过滤器,它将 /es/home.do 之类的传入 url 重写为 /home.do (并在请求中设置区域设置);这很好用。Filter 使用 HttpServletRequestWrapper 包装 ServletRequest,该 HttpServletRequestWrapper 覆盖 getContextPath() 以返回语言:
class FakeContextRequest extends HttpServletRequestWrapper {
private String context = "";
FakeContextRequest(HttpServletRequest request, String context) {
super(request);
// snip some validation code
this.context = request.getContextPath() + context;
}
@Override
public String getContextPath() {
return this.context;
}
}
我的过滤器转发到相应的请求,如下所示:
FakeContextRequest fr = new FakeContextRequest(request, lang);
fr.getRequestDispatcher(newResourceName).forward(fr, response);
我的问题是下一个 servlet 没有正确转发。下一个 servlet(通常是 Struts ActionServlet)转发到 JSP(通常使用 Struts Tiles);当我到达 JSP 时,HttpServletRequest 已经被包装了好几次,并且有问题的对象报告上下文为空(根上下文,这是实际部署应用程序的位置)。
我希望重写上下文,以便我所有已经存在的上下文感知代码可以自动将语言插入到编写的 URL 中。这可能吗?
编辑:我通过使用包装的 HttpServletResponse 而不是包装的 HttpServletRequest 解决了我的问题;我在 response.encodeURL() 方法中重写了 URL。