在Eclipse中使用Tomcat运行JSP页面出现404错误,问题出在哪里?
问题根因及修复方案
根因说明
- 按照Servlet规范要求,
WEB-INF属于Web应用的受保护目录,该目录下的所有文件(包括JSP、配置文件、静态资源等)都不允许被客户端直接通过URL访问,所以你访问带/WEB-INF/login.jsp的路径必然返回404,属于正常的安全限制。 - 移除
/WEB-INF后返回LoginServlet的输出内容,说明LoginServlet的URL映射规则刚好匹配到了你当前的访问路径,常见的配置错误包括:- Servlet映射配置了
/login.jsp,和你访问的JSP路径完全重合 - Servlet映射配置了
/*全局通配规则,拦截了所有应用内请求 - Servlet映射配置了
/,覆盖了Tomcat默认的静态资源/JSP处理规则
- Servlet映射配置了
修复步骤
- 调整资源存放路径:如果需要让
login.jsp可被直接访问,不要将其放在WEB-INF目录下,移动到Eclipse动态Web项目的根资源目录(默认是WebContent,部分新版本为WebApp)的根目录或其他非WEB-INF的公开目录即可。 - 修正Servlet映射配置:
- 若使用
web.xml配置,找到<servlet-mapping>标签下的<url-pattern>配置,避免设置为和JSP路径重合的规则,也不要使用/*全匹配规则,建议调整为功能匹配的路径,例如/login - 若使用
@WebServlet注解配置,修改注解的urlPatterns属性即可,示例:
@WebServlet(urlPatterns = "/login") public class LoginServlet extends HttpServlet { // 业务逻辑 } - 若使用
- 可选安全方案:如果不希望
login.jsp被直接访问,可以保留其在WEB-INF目录下,在LoginServlet中通过请求转发的方式返回页面,示例代码:
该场景下直接访问request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);http://<host>:<port>/FirstDynamicWebProject/login即可正常加载登录页面。
内容的提问来源于stack exchange,提问作者dbgar
相关产品推荐
相关产品推荐

