Java : 从 Servlet 重定向到一个空白页面

Java : Redirect from Servlet leads to a blank page

我正在尝试从 servlet 重定向到 HTML 页面。对于调试,我的 servlet、HTML 页面和 web.xml

中的代码量最少

我可以在没有 servlet 的情况下在浏览器中正常加载 HTML 页面。但是当我尝试从 servlet 重定向到同一页面时,只呈现一个空白页面。没有错误显示。 以下是相关代码。

web.xml

    <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>name</display-name>

    <listener>
        <listener-class>net.semandex.salsa.webapp.SalsaWebApp</listener-class>
    </listener>

    <servlet>
        <description>
        </description>
        <display-name>SalsaValidationServlet</display-name>
        <servlet-name>SalsaValidationServlet</servlet-name>
        <servlet-class>net.semandex.salsa.validationServlets.SalsaValidationServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SalsaValidationServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>

</web-app>

Servlet

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SalsaValidationServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String path = request.getPathInfo();
        if(path == null) return;
        String []p = path.split("/");
        if( !path.endsWith("licenseValidation.html") )
            //request.getRequestDispatcher("/auth/licenseValidation.html").forward(request, response);
            response.sendRedirect( request.getContextPath() + "/auth/licenseValidation.html" );
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

HTML Page - licenseValidation.html

<html>
<head>
<title>License upload page</title>
</head>
<body>

<form>
        <input type="text" name="name"/><br>        
        <input type="text" name="group"/>
        <input type="text" name="pass"/>
        <input type="submit" value="submit">            
</form>

</body>
</html> 

为什么这段代码加载的是空白页面而不是 HTML 页面? 重定向确实发生但到一个空白页面。浏览器中新 URL 的状态代码为 200,但调试器中的响应为空。

Edit:

问题是 BalusC 所述的“/*”URL 模式。在他的另一个答案中找到了更多有用的信息。 Difference between / and /* in servlet mapping url pattern

我不明白您为什么要重定向到图片? 但是,如果您仍想查看图像,请在 HTML/jsp 页面中添加 salsa-icon.png 并重定向到它。

您正在使用的请求 URL 没有关联任何额外的路径信息。所以 request.getPathInfo() 返回 null 并且没有触发重定向。

如果你想重定向到任何页面,即使没有额外的路径信息,你也需要删除空检查。只需重定向它:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //String path = request.getPathInfo();
    //if(path == null) return;
    //String []p = path.split("/");
    //if( !path.endsWith("licenseValidation.html") )
    //request.getRequestDispatcher("/auth/licenseValidation.html").forward(request, response);
    response.sendRedirect( request.getContextPath() + "/auth/licenseValidation.html" );
}

request.getPathInfo returns null 如果没有额外的路径信息:getPathInfo

假设您将 servlet-mapping 定义为:

<servlet-mapping>
    <servlet-name>SalsaValidationServlet</servlet-name>
    <url-pattern>/salsadb/*</url-pattern>
</servlet-mapping>

并且您正在向此 URL 发送请求:

http://localhost:8080/<appName>/salsadb/some_text

这次pathInfo不会为null;它将具有 /some_text 的值,这是与 URL.

关联的额外路径信息

编辑:

SalsaValidationServlet 被映射为向应用程序提供所有请求。即将到来的第一个请求是:

http://localhost:8080/salsadb/

SalsaValidationServletdoGet 方法被调用,pathInfo 的值为 /。它将请求重定向到 /auth/licenseValidation.html

现在浏览器将向重定向 URL 发送新请求,在本例中为:/auth/licenseValidation.htmlSalsaValidationServletdoGet 方法再次被调用,因为它与此 /* 映射:对应用程序的任何请求执行。这次pathInfo的值为/licenseValidation.html,即不满足这个if条件:

if( !path.endsWith("licenseValidation.html") )

因此这次没有触发重定向。

我认为这会澄清问题。如果可能,请更改 servlet-mapping 以仅向应用程序提供所需的请求。

我认为您的 url-pattern 标签有问题,请将其更改为 /* 以外的内容。