java - 为什么在运行欢迎文件列表中出现的 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
解决方案
这就是欢迎资源的工作方式:
容器可以使用转发、重定向或与直接请求无法区分的容器特定机制将请求发送到欢迎资源。
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;
}
}
推荐阅读
- c# - 如何在 WPF 应用程序中使用来自 ole32.dll 的游标?
- powershell - 如果结果与字符串匹配,如何从 PowerShell 获得真/假结果?
- python - ValueError:形状必须为 4 级,但对于 '{{node Conv2D_5}} 为 0 级,tf.nn.conv2d
- mysql - 从连接的 mysql 5.X 表中的每一行中至少获取最后 2 行
- web - twitter.com 如何使 JPEG 个人资料图像透明?
- javascript - 创建一个函数来打印带有 Jprompt 的答案
- gitlab - MR 打开时只运行一次 Gitlab CI 作业
- bash - 从 bash 脚本中删除所有注释
- kubernetes - Kubernetes 命名空间的 ECK Filebeat 自动发现过滤器
- c++ - 在获取用户输入时,我将输入的最小和最大数字设置为他们自己的变量,但无论出于何种原因,它们开始 = 为 0