我有一个 GWT 应用程序,其 URL 是 .../Organizer.html
。我也想从 url .../organizer
访问它。所以我决定用 servlet 过滤器中覆盖 getRequestURL()
和 getRequestURI()
方法的包装器替换原来的 HttpServletRequest
。
过滤代码:
String[] urlSplit = req.getRequestURL().toString().split("/");
String urlEnd = urlSplit[urlSplit.length -1];
if (urlEnd.equals(ORGANIZER_URL_ALTERNATIVE)){
String newUrl = req.getRequestURL().toString().
replace(ORGANIZER_URL_ALTERNATIVE, ORGANIZER_URL);
String newUri = req.getRequestURI().toString().
replace(ORGANIZER_URL_ALTERNATIVE, ORGANIZER_URL);
request = new ChangeUrlRequest(req, newUrl, newUri);
}
//Just to check if it works
req = (HttpServletRequest) request;
System.out.println(req.getRequestURL());
System.out.println(req.getRequestURI());
chain.doFilter(request, response);
请求包装器:
class ChangeUrlRequest extends HttpServletRequestWrapper {
private StringBuffer newUrlBuffer;
private String newUri;
public ChangeUrlRequest(HttpServletRequest request,String newUrl, String newUri) {
super(request);
newUrlBuffer = new StringBuffer(newUrl);
this.newUri = newUri;
}
@Override
public StringBuffer getRequestURL() {
return newUrlBuffer;
}
@Override
public String getRequestURI() {
return newUri;
}
}
这按预期方式工作,我可以使用 .../organizer
并替换为 .../Organizer.html
我现在遇到的问题是,即使 URL/URI 相同,无论我是从浏览器访问 .../organizer 还是 .../Organizer.html,只有 .../Organizer.html 有效,并且.../organizer Tomcat 提示找不到页面:HTTP Status 404 -/my-page/Organizer.html
System.out
上面代码的输出:
使用 Organizer.html(有效):
网址:http://localhost:8080/my-page/Organizer.html
URI:/my-page/Organizer.html
与组织者(给出上面提到的 404):
网址:http://localhost:8080/my-page/Organizer.html
URI:/my-page/Organizer.html
我还需要覆盖或更改其他内容吗?
最佳答案
如果目标是能够通过任一 URL 访问应用程序,也许有更简单的解决方案。您可以编写可在 /organizer
访问的 servlet,并将请求转发到 HTML 页面,例如:
@WebServlet(urlPatterns="/organizer")
public class OrganizerServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) {
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/Organizer.html");
dispatcher.forward(request,response);
}
}
请注意,如果 /organizer
和 /Organizer.html
不在应用程序的根目录下,您可能需要修改它们的路径。
关于java - Servlet 过滤器 - 更改 URL 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983931/