SSH框架报错404?别慌,手把手教你精准排查与修复
当你在开发或维护基于经典SSH(Struts2 + Spring + Hibernate)框架的项目时,突然遭遇冰冷的“404 Not Found”错误页面,确实令人沮丧,这个错误意味着服务器无法找到你请求的资源(页面、图片、接口等),在SSH框架的复杂整合环境下,原因可能比想象中更隐蔽,别担心,本文将带你深入核心,系统地定位并解决SSH中的404难题。
404错误的本质与SSH场景

HTTP 404状态码是一个标准的客户端错误响应,表明服务器无法定位你请求的URL资源,在SSH框架应用中,这通常不是服务器物理宕机,而是配置错误、路径映射失效或资源缺失导致的,理解SSH框架的请求处理流程是关键:
- 用户发起请求: 浏览器访问特定URL (如:
http://yourdomain.com/app/user/list.action)。 - Web容器拦截: Tomcat等容器接收请求。
- Struts2 Filter 接管:
web.xml中配置的Struts2核心过滤器 (StrutsPrepareAndExecuteFilter或旧版FilterDispatcher) 拦截请求。 - Action 匹配与调用: Struts2 根据
struts.xml配置文件,将请求URL映射到对应的Action类和方法。 - Spring 注入与管理: Action类通常由Spring IoC容器管理并注入所需Service。
- Service 与 Hibernate 交互: Action调用Spring管理的Service,Service通过Hibernate进行数据库操作。
- 结果渲染: Action方法执行后返回一个结果字符串 (如
”success”),Struts2 根据struts.xml配置找到对应的结果视图 (如JSP页面/WEB-INF/jsp/user/list.jsp) 进行渲染输出。
任何一个环节断裂,都可能将你引向404深渊。
SSH框架中404错误的常见根源与解决方案
URL 路径或 Action 配置错误 (核心高频问题)
- 原因: 请求的URL在
struts.xml中没有对应的<action>配置;<action>的name或namespace属性与请求URL不匹配;URL后缀 (如.action) 未在Struts2配置中启用或与过滤器映射不匹配。 - 排查与修复:
- 仔细核对URL: 检查浏览器地址栏的URL是否完全正确,包括大小写、路径层级、命名空间、参数和预期的后缀(如
.action)。 - 审查
struts.xml: 找到对应的<package>的namespace和<action>的name,确保请求的URL 符合namespace + “/” + actionName + extension的规则,若配置为<package name=”default” namespace=”/user”> <action name=”list” class=”…”> … </action> </package>, 则有效URL应为/yourAppContext/user/list.action。 - 检查后缀配置: 确认
struts.xml中的<constant name=”struts.action.extension” value=”action,”/>是否包含你使用的后缀。web.xml中Struts2过滤器的<url-pattern>要匹配该后缀(如/*.action或 )。 - 重启生效: 修改
struts.xml后,务必重启Web服务器使配置生效。
- 仔细核对URL: 检查浏览器地址栏的URL是否完全正确,包括大小写、路径层级、命名空间、参数和预期的后缀(如
- 原因: 请求的URL在
视图文件 (JSP) 路径错误或缺失
- 原因: Action执行后返回结果字符串,但Struts2在
struts.xml的<result>元素指定的路径下找不到对应的JSP文件;JSP文件被放错位置(如未放在WEB-INF下导致直接访问);JSP文件名拼写错误。 - 排查与修复:
- 检查
<result>配置: 定位到你的Action配置,查看返回结果(如success)对应的<result>元素指定的物理路径(如/WEB-INF/jsp/user_list.jsp),确保路径拼写绝对正确。 - 核对物理位置: 在项目部署目录(如Tomcat的
webapps/yourapp/)下,按图索骥找到对应的JSP文件,确认其存在且位于正确路径,最佳实践是将JSP放在WEB-INF目录下,防止用户直接访问。 - 检查文件名: 仔细核对JSP文件名是否与配置完全一致,包括大小写和扩展名
.jsp。
- 检查
- 原因: Action执行后返回结果字符串,但Struts2在
静态资源被错误拦截

- 原因: Struts2的核心过滤器配置为拦截所有请求 (
<url-pattern>/*</url-pattern>),导致对CSS、JS、图片等静态资源的请求也被误认为Action请求,自然无法找到对应Action而返回404。 - 排查与修复:
- 观察现象: 页面框架可能出来(说明主请求Action成功),但样式混乱、图片不显示、JS失效,浏览器开发者工具(F12)的Network标签页会显示大量404的静态资源请求。
- 配置排除: 在
struts.xml中配置常量,排除静态资源路径:<struts> <constant name=”struts.action.excludePattern” value=”.*\.(css|js|png|jpg|gif|ico)”/> … <!-- 其他配置 --> </struts> - 使用默认Servlet: 在
web.xml中配置默认Servlet (default或DefaultServlet) 来处理静态资源,并确保其在Struts2过滤器之前映射:<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> <url-pattern>*.js</url-pattern> <url-pattern>*.png</url-pattern> <!-- 添加其他静态资源后缀 --> </servlet-mapping>确保
<servlet-mapping>顺序在Struts2过滤器之前,或使用精确路径前缀(如 `/static/`)管理静态资源。*
- 原因: Struts2的核心过滤器配置为拦截所有请求 (
Spring MVC 或其它框架干扰 (整合冲突)
- 原因: 项目中同时存在Spring MVC的配置(如
DispatcherServlet)且其<url-pattern>与Struts2过滤器冲突,导致请求被错误地转发到Spring MVC,而Spring MVC没有对应的Controller处理。 - 排查与修复:
- 检查
web.xml: 仔细查看web.xml中所有Servlet和Filter的<url-pattern>配置,确保Struts2过滤器 (StrutsPrepareAndExecuteFilter) 和Spring MVC的DispatcherServlet处理的URL模式没有重叠或冲突,常见的做法是让Struts2处理特定后缀(如.action),而Spring MVC处理其他(如/rest/*)或特定后缀(如.do)。 - 明确职责: 在SSH项目中,通常不启用Spring MVC的
DispatcherServlet,业务逻辑控制应由Struts2 Action负责,如果确实需要同时使用,必须严格划分URL命名空间。
- 检查
- 原因: 项目中同时存在Spring MVC的配置(如
项目部署上下文路径 (Context Path) 问题
- 原因: 应用部署在Web容器(如Tomcat)时,可能设置了上下文路径(如
/myapp),页面中的链接(<a href>,<form action>,<img src>)或重定向如果使用了绝对路径但未包含上下文路径,就会导致404。 - 排查与修复:
- 使用相对路径或动态生成: 在JSP页面中,使用相对于当前页面的路径(如
user/list.action),或强烈建议使用Struts2标签或JSTL动态生成包含上下文路径的URL:- Struts2标签:
<s:url value=”/user/list.action”/>或<s:form action=”user/list”>。 - JSTL:
<c:url value=”/user/list.action”/>。
- Struts2标签:
- 检查部署位置: 确认应用是否部署在ROOT上下文()下,如果不是,请求URL必须包含正确的上下文路径。
- 使用相对路径或动态生成: 在JSP页面中,使用相对于当前页面的路径(如
- 原因: 应用部署在Web容器(如Tomcat)时,可能设置了上下文路径(如
拦截器 (Interceptor) 中断请求
- 原因: Struts2或自定义的拦截器在请求到达Action之前,根据条件(如登录检查、权限验证)中断了请求流程,并通过返回某个结果(如
”login”)跳转,但该结果对应的视图路径配置错误或视图文件缺失,也可能导致最终呈现404。 - 排查与修复:
- 检查拦截器配置: 查看
struts.xml中应用到该Action或Package的拦截器栈,关注自定义拦截器或defaultStack中可能中断流程的拦截器(如token,paramsPrepareParamsStack中的潜在问题)。 - 检查拦截器返回值: 在拦截器中,如果调用了
Action.ERROR或其他自定义结果字符串,确保这些结果在struts.xml中有正确且存在的<result>映射。 - 日志输出: 在拦截器关键点添加日志输出,观察请求是否被拦截以及返回的结果值。
- 检查拦截器配置: 查看
- 原因: Struts2或自定义的拦截器在请求到达Action之前,根据条件(如登录检查、权限验证)中断了请求流程,并通过返回某个结果(如
高效诊断404的实用技巧
- 开启详细日志: 这是最强大的武器!配置Struts2、Spring和Web容器(Tomcat)输出DEBUG或TRACE级别日志,在
struts.xml中添加<constant name=”struts.devMode” value=”true”/>(开发环境),在log4j.properties或logback.xml中设置相关包(com.opensymphony.xwork2,org.apache.struts2,org.springframework,your.package)的日志级别为DEBUG,日志会清晰记录URL如何被解析(或未被解析)到哪个Action、拦截器执行过程、结果渲染的视图路径等。 - 利用浏览器开发者工具:
- Network 标签页: 精确查看哪个请求返回了404,检查其请求URL、方法(GET/POST)、状态码、响应头,确认请求的URL是否是你期望的。
- Console 标签页: 查看是否有JS错误阻止了请求的发起或URL的构造。
- Sources 标签页: 检查页面源码中链接、表单action、资源(src/href)的URL是否正确(尤其是上下文路径)。
- 逐步缩小范围:
- 是所有页面404,还是特定页面404?所有页面404可能指向全局配置错误(如过滤器url-pattern、struts配置未加载),特定页面则聚焦该页面的配置和文件。
- 访问一个极其简单的新建Action和JSP页面是否能成功?快速验证框架基本配置。
- 直接尝试访问一个已知存在的静态资源(如图片URL)是否能成功?判断是否是静态资源拦截问题。
- 检查服务器部署目录: 登录服务器,查看Web应用的部署目录(如Tomcat的
webapps/yourapp/),确认编译后的class文件、struts.xml、applicationContext.xml等配置文件以及JSP、静态资源文件是否被正确部署到预期位置,文件权限问题也可能导致无法读取。 - 清除缓存: 清除浏览器缓存、服务器(尤其是使用了缓存插件或配置时)缓存,有时陈旧的缓存会带来困惑。
个人观点: 解决SSH框架的404错误,本质上是一场与配置细节的较量,耐心、细致的观察力和对请求流程的清晰认知是成功的关键,熟练运用日志工具,结合浏览器的诊断能力,绝大多数404都能被精准定位,框架越复杂,配置的严谨性就越重要,每一次成功解决这类问题,都是对系统理解更深一步的契机,别怕报错,它正是你成为更成熟开发者的必经阶梯。

希望这份详尽的指南能助你快速摆脱SSH 404的困扰!
