Java ServletFilter-更改URL无效

Java ServletFilter-更改URL无效,java,tomcat,servlets,Java,Tomcat,Servlets,我有一个GWT应用程序,它的URL是…/Organizer.html。我也想从url…/organizer访问它。因此,我决定用servlet过滤器中覆盖了getRequestURL和getRequestURI方法的包装器替换原来的HttpServletRequest 过滤代码: String[] urlSplit = req.getRequestURL().toString().split("/"); String urlEnd = urlSplit[urlSplit.length -1];

我有一个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的路径不在应用程序的根目录下,则可能需要修改它们