> 文章列表 > 管理后台老项目 SSM 框架,任何请求均返回错误码 500

管理后台老项目 SSM 框架,任何请求均返回错误码 500

管理后台老项目 SSM 框架,任何请求均返回错误码 500

文章目录

  • 管理后台老项目 SSM 框架,任何请求均返回错误码 500
    • 1. 出现问题
    • 2. 解决过程
      • 1. 查看日志
      • 2. 猜测配置有问题
      • 3. 根据架构图确定问题
    • 3. 解决方案

管理后台老项目 SSM 框架,任何请求均返回错误码 500

1. 出现问题

  • 管理后台使用:Struts2 + Spring + MyBatis 框架,在某次测试平台重启后,启动成功未抛出异常,但是任何请求均返回错误码 500

2. 解决过程

1. 查看日志

  • 首先登录测试平台 Linux 环境,手动调用一次,然后查看调用异常日志
  • cd 目录
  • tail -f 日志.log ,如果日志量比较大可以使用 tail -f 日志.log | grep -C 20 'Exception'
  • 发现没有抛出异常
  • 然后详细去看调用过程,发现 Action 正常处理了
  • 由于问题之前未出现过,因此尝试重启一次,仍未能解决,然后重启上一次分支,仍然是相同问题

2. 猜测配置有问题

  • 首先猜测是发布配置问题,这个项目是 Struts2 + Spring + MyBatis 的老框架,使用 war 包 + Tomcat 部署
  • 进目录 cd /Java/servers/xxx/conf,查看 server.xml 配置
  • 发现 war 包目录为:<Context docBase="/xxx/Java/deploy/master",对应目录下查看文件是正常的
  • 其次觉得是否是响应端口被占用,还是在 server.xml 中查到
  • <Connector port="9xxx" protocol="HTTP/1.1" connectionTimeout="xxx" redirectPort="8xxx" />
  • <Connector port="8xxx" protocol="AJP/xxx" redirectPort="xxx" />
  • 使用 lsof -i:redirectPort 的值 命令,发现端口未被占用
  • 最后尝试改为其他接口,发现任何接口均返回 500,与配置无关

3. 根据架构图确定问题

  • 根据添加日志显示,Action 执行没问题,查表也有数据,应该是 Struts2 过程中出现的问题

  • 因此根据 struts2 架构
    在这里插入图片描述

  • 应该是过滤器或者拦截器后处理的时候出现的问题

  • 代码搜索 struts.xml,发现仅有自定义拦截器

  • <interceptors> <interceptor name="xxxInterceptor" class="XxxInterceptor" />

  • 查看拦截器 XxxInterceptor.java 代码,发现日志打印到了其他目录(真坑…)

  • 找到对应目录再进行第一步查看日志

  • 发现在 Action 获取结果后,拦截器后置代码,发生了类加载异常,具体去看发现是解析从配置中心获取的 Json 错误

  • 至此,问题已经找到,配置中心 Json 被人改错了

3. 解决方案

  • 将配置改成正确的 Json 格式数据,其次在自定义拦截器业务里加异常捕获与规范日志目录
  • 启示:测试环境的配置也要谨慎修改,并且如果发生诡异的异常,可以尝试回顾今天的操作