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/
SalsaValidationServlet
的 doGet
方法被调用,pathInfo
的值为 /
。它将请求重定向到 /auth/licenseValidation.html
。
现在浏览器将向重定向 URL 发送新请求,在本例中为:/auth/licenseValidation.html
。 SalsaValidationServlet
的 doGet
方法再次被调用,因为它与此 /*
映射:对应用程序的任何请求执行。这次pathInfo的值为/licenseValidation.html
,即不满足这个if
条件:
if( !path.endsWith("licenseValidation.html") )
因此这次没有触发重定向。
我认为这会澄清问题。如果可能,请更改 servlet-mapping
以仅向应用程序提供所需的请求。
我认为您的 url-pattern 标签有问题,请将其更改为 /* 以外的内容。
我正在尝试从 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/
SalsaValidationServlet
的 doGet
方法被调用,pathInfo
的值为 /
。它将请求重定向到 /auth/licenseValidation.html
。
现在浏览器将向重定向 URL 发送新请求,在本例中为:/auth/licenseValidation.html
。 SalsaValidationServlet
的 doGet
方法再次被调用,因为它与此 /*
映射:对应用程序的任何请求执行。这次pathInfo的值为/licenseValidation.html
,即不满足这个if
条件:
if( !path.endsWith("licenseValidation.html") )
因此这次没有触发重定向。
我认为这会澄清问题。如果可能,请更改 servlet-mapping
以仅向应用程序提供所需的请求。
我认为您的 url-pattern 标签有问题,请将其更改为 /* 以外的内容。