首页 > 解决方案 > 为什么在运行欢迎文件列表中出现的 servlet 时 url 不改变

问题描述

我有简单的 servlet 打印一些响应

@WebServlet(name = "helloServlet", value = "/hello-servlet" , s )
public class HelloServlet extends HttpServlet {
    private String message;

    public void init() {
        message = "Hello World!";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");

        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
    }

    public void destroy() {
    }
}

web.xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>hello-servlet</welcome-file>
    </welcome-file-list>
</web-app>

问题是当它重定向到欢迎文件列表中的 servlet 时,url 没有改变
我的 url:http://localhost:8080/testsss_war_exploded/
但应该是:http://localhost:8080/testsss_war_exploded/hello-servlet

标签: javatomcatservletsweb-deploymentwelcome-file

解决方案


这就是欢迎资源的工作方式:

容器可以使用转发、重定向或与直接请求无法区分的容器特定机制将请求发送到欢迎资源。

Servlet 5.0 规范

Tomcat 在内部重定向请求。如果你想发送一个 HTTP 重定向,你需要自己做。您可以检查原始 URI 以查看请求是否由欢迎文件机制转发:

@WebServlet(name = "helloServlet", urlPatterns = {"/hello-servlet"})
public class HelloServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      if (req.getRequestURI().endsWith("/")) {
         resp.sendRedirect("hello-servlet");
         return;
      }
}

另一种解决方案是放弃欢迎文件机制并将您的 servlet 显式绑定到应用程序根目录:

@WebServlet(name = "helloServlet", urlPatterns = {"", "/hello-servlet"})
public class HelloServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      if (req.getServletPath().isEmpty()) {
         resp.sendRedirect("hello-servlet");
         return;
      }
}

推荐阅读