java—为什么在运行欢迎文件列表中显示的servlet时url不更改

rqcrx0a6  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(439)

我有一个简单的servlet,它打印一些东西来响应

  1. @WebServlet(name = "helloServlet", value = "/hello-servlet" , s )
  2. public class HelloServlet extends HttpServlet {
  3. private String message;
  4. public void init() {
  5. message = "Hello World!";
  6. }
  7. public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
  8. response.setContentType("text/html");
  9. // Hello
  10. PrintWriter out = response.getWriter();
  11. out.println("<html><body>");
  12. out.println("<h1>" + message + "</h1>");
  13. out.println("</body></html>");
  14. }
  15. public void destroy() {
  16. }
  17. }

这就是web.xml的外观:

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

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

5cnsuln7

5cnsuln71#

这就是欢迎资源的工作方式:
容器可以使用转发、重定向或特定于容器的机制将请求发送到欢迎资源,这些机制与直接请求无法区分。
(servlet 5.0规范)
tomcat在内部重定向请求。如果您想发送http重定向,您需要自己发送。您可以检查原始uri以查看请求是否由欢迎文件机制转发:

  1. @WebServlet(name = "helloServlet", urlPatterns = {"/hello-servlet"})
  2. public class HelloServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. if (req.getRequestURI().endsWith("/")) {
  6. resp.sendRedirect("hello-servlet");
  7. return;
  8. }
  9. }

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

  1. @WebServlet(name = "helloServlet", urlPatterns = {"", "/hello-servlet"})
  2. public class HelloServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. if (req.getServletPath().isEmpty()) {
  6. resp.sendRedirect("hello-servlet");
  7. return;
  8. }
  9. }
展开查看全部

相关问题