在生产环境访问WEB-INF目录中的页面时,会出现404错误;而在开发环境中则不会出现该问题
在生产环境下访问web-inf目录中的页面时会出现404错误,但在开发环境中不会。服务器是Tomcat 9。Java 8。
我实在找不到原因,服务器日志也没有显示任何错误。先行感谢你的帮助。
Servlet
package br.com.bahiatransport.bahiatransport.controller;
import br.com.bahiatransport.bahiatransport.model.ModelSlctcMudancaResidencial;
import br.com.bahiatransport.bahiatransport.model.ModelUser;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name = "ControllerServlet", urlPatterns = {
"/authentication",
"/main"}, loadOnStartup = 1)
public class ControllerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userPath = request.getServletPath();
switch (userPath) {
case "/authentication":
break;
case "/main":
break;
default:
throw new AssertionError();
}
// use RequestDispatcher to forward request internally
String url = "/WEB-INF/view" + userPath + ".jsp";
try {
request.getRequestDispatcher(url).forward(request, response);
} catch (ServletException | IOException ex) {
throw new RuntimeException("Erro no ControllerServlet: " + ex);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userPath = request.getServletPath();
switch (userPath) {
case "/authentication":
ModelUser user = new ModelUser();
user.setUsername(request.getParameter("user"));
user.setPassword(request.getParameter("password"));
ControllerUser controllerUser = new ControllerUser();
if (controllerUser.authentication(user)) {
// LOGIN BEM SUCEDIDO.
HttpSession session = request.getSession();
session.setAttribute("user", user);
session.setAttribute("idSession", session.getId());
List<ModelSlctcMudancaResidencial> list = new ArrayList<>();
ControllerSlctcMudancaResidencial controllerSlctcMudancaResidencial = new ControllerSlctcMudancaResidencial();
controllerSlctcMudancaResidencial.findAll(list);
session.setAttribute("mudancaResidencial", list);
userPath = "/main";
}
break;
case "/main":
break;
default:
throw new AssertionError();
}
// use RequestDispatcher to forward request internally
String url = "/WEB-INF/view" + userPath + ".jsp";
try {
request.getRequestDispatcher(url).forward(request, response);
} catch (ServletException | IOException ex) {
throw new RuntimeException("Erro no ControllerServlet: " + ex);
}
}
}
JSP登录
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<title>Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="favicon.ico" rel="shortcut icon"/>
<meta name="robots" content="index, follow">
<meta name="Googlebot" content="index, follow">
<link rel="canonical" href="https://bahiatransport.com.br/login">
<link href="style-header.css" rel="stylesheet" type="text/css" media="screen">
<link href="style.css" rel="stylesheet" type="text/css" media="screen">
</head>
<body>
<%@include file="WEB-INF/jspf/header.jspf" %>
<main>
<div id="outer-main-1">
<div class="wrapper">
<div id="breadcrumbs">
<p><a href="<c:url value="index.jsp"/>">Home</a> / Login</p>
</div>
<section id="banner-3">
<h1>Welcome to Bahia Transport</h1>
<form action="<c:url value="/authentication"/>" method="post">
<fieldset>
<legend>User</legend>
<input type="text" id="user" name="user" required="requered">
</fieldset>
<fieldset>
<legend>Password</legend>
<input type="password" id="password" name="password" minlength="6" required="requered">
</fieldset>
<button type="submit" class="submit_login">Login</button>
</form>
</section>
</div>
</div>
</main>
<%@include file="WEB-INF/jspf/footer.jspf" %>
</body>
</html>
解决方案
如果你没有看到任何相关日志,那么你很可能是在错误的地方查找。你应该查看哪个文件,以及是否应该期望看到任何日志,取决于你尚未提供的配置细节,但至少你应该在你的Web服务器的访问日志和错误日志中看到404本身被记录。Tomcat自身的日志数据,通常你会在其中找到详细信息,可能会被引导到其他位置。
我猜想你已经验证了 /WEB-INF/view/authentication.jsp 实际上确实存在于生产环境部署的webapp中,并且它对服务器是可访问的(所有权、权限、其他访问控制)。既然你在问题文本中写了“web-inf”而不是“WEB-INF”,我注意到路径通常应区分大小写。
可能还会有其他因素影响,例如Servlet过滤器或某些第三方框架,但相当可能的是,你的JSP中的 <%@include ...%> 脚本片段在起作用。由于它们的 file 属性并非以 / 开头,它们将相对于承载该JSP的应用路径来解析(/WEB-INF/view),因此
<%@include file="WEB-INF/jspf/header.jspf" %>
将会在应用路径 /WEB-INF/view/WEB-INF/jspf/header.jspf 上查找,这很可能不是你想要的。这也有可能导致找不到这些脚本片段,从而产生404错误而不是500错误,尤其是考虑到还有一个关于无法找到用于通知主错误的 ErrorDocument 的二次错误。你几乎肯定需要
<%@include file="/WEB-INF/jspf/header.jspf" %>
来替代。页脚也类似。
至于为什么在开发环境里不会看到错误,我的第一种猜测是你那里其实确实有 /WEB-INF/view/WEB-INF/jspf/header.jspf 和 .../footer.jspf,无论是有意还是无意。也可能有其他解释。