java - Servlet 过滤器 - 更改 URL 不起作用

标签 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];


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/

相关文章:

java - maven 中的 IntelliJ 目录小蓝点标签

java - HttpSession.invalidate() 和 TCPDUMP

java - "atomic"和 "synchronous"在编程中是同义词吗?

java - 如何从 Firebase 存储中检索图像的下载 URL?

java - 请求的资源在 Servlet、Tomcat7 中不可用

spring-mvc - Tomcat 8 - 在类路径上未检测到 Spring WebApplicationInitializer 类型

java - org.hibernate.hql.ast.QuerySyntaxException : Employee_detail is not mapped [from Employee_detail]

java - INPUT 具有多个值,每个值有多个值

jsp - 如何在 jsp 文件中使用从 servlet 传递的 bean 值

java - Java DOM API 中的绑定(bind)命名空间