在生产环境访问WEB-INF目录中的页面时,会出现404错误;而在开发环境中则不会出现该问题

前端开发 2026-07-09

在生产环境下访问web-inf目录中的页面时会出现404错误,但在开发环境中不会。服务器是Tomcat 9。Java 8。

我实在找不到原因,服务器日志也没有显示任何错误。先行感谢你的帮助。

错误404

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,无论是有意还是无意。也可能有其他解释。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章