【解决去除springboot-内嵌tomcat的异常信息显示】去掉版本号和异常信息

调用这个,能复现tomcat的报错
http://localhost:8182/defaultroot/DownloadServlet?modeType=2&path=html&FileName=…\login.jsp&name=123&fiewviewdownload=2&cd=inline&downloadAll=2
在这里插入图片描述springboot项目如何隐藏?

springboot内嵌了tomat,比如这个版本:tomcat-embed-core-8.5.96
找到这个tomcat-embed-core的源码,
将showReport=true,修改为showReport=false
将showServerInfo=true ,修改为showServerInfo=false

方法一:
在项目中增加ErrorReportValve.java ,实现覆盖内嵌中的类。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.apache.catalina.valves;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.ServletException;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.util.ErrorPageSupport;
import org.apache.catalina.util.IOTools;
import org.apache.catalina.util.ServerInfo;
import org.apache.coyote.ActionCode;
import org.apache.tomcat.util.ExceptionUtils;
import org.apache.tomcat.util.descriptor.web.ErrorPage;
import org.apache.tomcat.util.res.StringManager;
import org.apache.tomcat.util.security.Escape;

/**
 * 解决调试信息泄露漏洞,修改showReport=false,showServerInfo=false
 */
public class ErrorReportValve extends ValveBase {
    private boolean showReport = false;
    private boolean showServerInfo = false;
    private final ErrorPageSupport errorPageSupport = new ErrorPageSupport();

    public ErrorReportValve() {
        super(true);
    }

    public void invoke(Request request, Response response) throws IOException, ServletException {
        this.getNext().invoke(request, response);
        if (response.isCommitted()) {
            if (response.setErrorReported()) {
                AtomicBoolean ioAllowed = new AtomicBoolean(true);
                response.getCoyoteResponse().action(ActionCode.IS_IO_ALLOWED, ioAllowed);
                if (ioAllowed.get()) {
                    try {
                        response.flushBuffer();
                    } catch (Throwable var5) {
                        ExceptionUtils.handleThrowable(var5);
                    }

                    response.getCoyoteResponse().action(ActionCode.CLOSE_NOW, request.getAttribute("javax.servlet.error.exception"));
                }
            }

        } else {
            Throwable throwable = (Throwable)request.getAttribute("javax.servlet.error.exception");
            if (!request.isAsync() || request.isAsyncCompleting()) {
                if (throwable != null && !response.isError()) {
                    response.reset();
                    response.sendError(500);
                }

                response.setSuspended(false);

                try {
                    this.report(request, response, throwable);
                } catch (Throwable var6) {
                    ExceptionUtils.handleThrowable(var6);
                }

            }
        }
    }

    protected ErrorPage findErrorPage(int statusCode, Throwable throwable) {
        ErrorPage errorPage = null;
        if (throwable != null) {
            errorPage = this.errorPageSupport.find(throwable);
        }

        if (errorPage == null) {
            errorPage = this.errorPageSupport.find(statusCode);
        }

        if (errorPage == null) {
            errorPage = this.errorPageSupport.find(0);
        }

        return errorPage;
    }

    protected void report(Request request, Response response, Throwable throwable) {
        int statusCode = response.getStatus();
        if (statusCode >= 400 && response.getContentWritten() <= 0L && response.setErrorReported()) {
            AtomicBoolean result = new AtomicBoolean(false);
            response.getCoyoteResponse().action(ActionCode.IS_IO_ALLOWED, result);
            if (result.get()) {
                ErrorPage errorPage = this.findErrorPage(statusCode, throwable);
                if (errorPage == null || !this.sendErrorPage(errorPage.getLocation(), response)) {
                    String message = Escape.htmlElementContent(response.getMessage());
                    String reason;
                    if (message == null) {
                        if (throwable != null) {
                            reason = throwable.getMessage();
                            if (reason != null && reason.length() > 0) {
                                Scanner scanner = new Scanner(reason);

                                try {
                                    message = Escape.htmlElementContent(scanner.nextLine());
                                } catch (Throwable var17) {
                                    try {
                                        scanner.close();
                                    } catch (Throwable var15) {
                                        var17.addSuppressed(var15);
                                    }

                                    throw var17;
                                }

                                scanner.close();
                            }
                        }

                        if (message == null) {
                            message = "";
                        }
                    }

                    reason = null;
                    String description = null;
                    StringManager smClient = StringManager.getManager("org.apache.catalina.valves", request.getLocales());
                    response.setLocale(smClient.getLocale());

                    try {
                        reason = smClient.getString("http." + statusCode + ".reason");
                        description = smClient.getString("http." + statusCode + ".desc");
                    } catch (Throwable var16) {
                        ExceptionUtils.handleThrowable(var16);
                    }

                    if (reason == null || description == null) {
                        if (message.isEmpty()) {
                            return;
                        }

                        reason = smClient.getString("errorReportValve.unknownReason");
                        description = smClient.getString("errorReportValve.noDescription");
                    }

                    StringBuilder sb = new StringBuilder();
                    sb.append("<!doctype html><html lang=\"");
                    sb.append(smClient.getLocale().getLanguage()).append("\">");
                    sb.append("<head>");
                    sb.append("<title>");
                    sb.append(smClient.getString("errorReportValve.statusHeader", new Object[]{String.valueOf(statusCode), reason}));
                    sb.append("</title>");
                    sb.append("<style type=\"text/css\">");
                    sb.append("body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}");
                    sb.append("</style>");
                    sb.append("</head><body>");
                    sb.append("<h1>");
                    sb.append(smClient.getString("errorReportValve.statusHeader", new Object[]{String.valueOf(statusCode), reason})).append("</h1>");
                    if (this.isShowReport()) {
                        sb.append("<hr class=\"line\" />");
                        sb.append("<p><b>");
                        sb.append(smClient.getString("errorReportValve.type"));
                        sb.append("</b> ");
                        if (throwable != null) {
                            sb.append(smClient.getString("errorReportValve.exceptionReport"));
                        } else {
                            sb.append(smClient.getString("errorReportValve.statusReport"));
                        }

                        sb.append("</p>");
                        if (!message.isEmpty()) {
                            sb.append("<p><b>");
                            sb.append(smClient.getString("errorReportValve.message"));
                            sb.append("</b> ");
                            sb.append(message).append("</p>");
                        }

                        sb.append("<p><b>");
                        sb.append(smClient.getString("errorReportValve.description"));
                        sb.append("</b> ");
                        sb.append(description);
                        sb.append("</p>");
                        if (throwable != null) {
                            String stackTrace = this.getPartialServletStackTrace(throwable);
                            sb.append("<p><b>");
                            sb.append(smClient.getString("errorReportValve.exception"));
                            sb.append("</b></p><pre>");
                            sb.append(Escape.htmlElementContent(stackTrace));
                            sb.append("</pre>");
                            int loops = 0;

                            for(Throwable rootCause = throwable.getCause(); rootCause != null && loops < 10; ++loops) {
                                stackTrace = this.getPartialServletStackTrace(rootCause);
                                sb.append("<p><b>");
                                sb.append(smClient.getString("errorReportValve.rootCause"));
                                sb.append("</b></p><pre>");
                                sb.append(Escape.htmlElementContent(stackTrace));
                                sb.append("</pre>");
                                rootCause = rootCause.getCause();
                            }

                            sb.append("<p><b>");
                            sb.append(smClient.getString("errorReportValve.note"));
                            sb.append("</b> ");
                            sb.append(smClient.getString("errorReportValve.rootCauseInLogs"));
                            sb.append("</p>");
                        }

                        sb.append("<hr class=\"line\" />");
                    }

                    if (this.isShowServerInfo()) {
                        sb.append("<h3>").append(ServerInfo.getServerInfo()).append("</h3>");
                    }

                    sb.append("</body></html>");

                    try {
                        try {
                            response.setContentType("text/html");
                            response.setCharacterEncoding("utf-8");
                        } catch (Throwable var18) {
                            ExceptionUtils.handleThrowable(var18);
                            if (this.container.getLogger().isDebugEnabled()) {
                                this.container.getLogger().debug("Failure to set the content-type of response", var18);
                            }
                        }

                        Writer writer = response.getReporter();
                        if (writer != null) {
                            writer.write(sb.toString());
                            response.finishResponse();
                        }
                    } catch (IllegalStateException | IOException var19) {
                    }

                }
            }
        }
    }

    protected String getPartialServletStackTrace(Throwable t) {
        StringBuilder trace = new StringBuilder();
        trace.append(t.toString()).append(System.lineSeparator());
        StackTraceElement[] elements = t.getStackTrace();
        int pos = elements.length;

        int i;
        for(i = elements.length - 1; i >= 0; --i) {
            if (elements[i].getClassName().startsWith("org.apache.catalina.core.ApplicationFilterChain") && elements[i].getMethodName().equals("internalDoFilter")) {
                pos = i;
                break;
            }
        }

        for(i = 0; i < pos; ++i) {
            if (!elements[i].getClassName().startsWith("org.apache.catalina.core.")) {
                trace.append('\t').append(elements[i].toString()).append(System.lineSeparator());
            }
        }

        return trace.toString();
    }

    private boolean sendErrorPage(String location, Response response) {
        File file = new File(location);
        if (!file.isAbsolute()) {
            file = new File(this.getContainer().getCatalinaBase(), location);
        }

        if (file.isFile() && file.canRead()) {
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");

            try {
                OutputStream os = response.getOutputStream();
                InputStream is = new FileInputStream(file);
                IOTools.flow(is, os);
                return true;
            } catch (IOException var6) {
                this.getContainer().getLogger().warn(sm.getString("errorReportValve.errorPageIOException", new Object[]{location}), var6);
                return false;
            }
        } else {
            this.getContainer().getLogger().warn(sm.getString("errorReportValve.errorPageNotFound", new Object[]{location}));
            return false;
        }
    }

    public void setShowReport(boolean showReport) {
        this.showReport = showReport;
    }

    public boolean isShowReport() {
        return this.showReport;
    }

    public void setShowServerInfo(boolean showServerInfo) {
        this.showServerInfo = showServerInfo;
    }

    public boolean isShowServerInfo() {
        return this.showServerInfo;
    }

    public boolean setProperty(String name, String value) {
        ErrorPage ep;
        if (name.startsWith("errorCode.")) {
            int code = Integer.parseInt(name.substring(10));
            ep = new ErrorPage();
            ep.setErrorCode(code);
            ep.setLocation(value);
            this.errorPageSupport.add(ep);
            return true;
        } else if (name.startsWith("exceptionType.")) {
            String className = name.substring(14);
            ep = new ErrorPage();
            ep.setExceptionType(className);
            ep.setLocation(value);
            this.errorPageSupport.add(ep);
            return true;
        } else {
            return false;
        }
    }

    public String getProperty(String name) {
        String result;
        ErrorPage ep;
        if (name.startsWith("errorCode.")) {
            int code = Integer.parseInt(name.substring(10));
            ep = this.errorPageSupport.find(code);
            if (ep == null) {
                result = null;
            } else {
                result = ep.getLocation();
            }
        } else if (name.startsWith("exceptionType.")) {
            String className = name.substring(14);
            ep = this.errorPageSupport.find(className);
            if (ep == null) {
                result = null;
            } else {
                result = ep.getLocation();
            }
        } else {
            result = null;
        }

        return result;
    }
}

方法二:
将修改好的.class文件替换tomcat-embed-core.jar的源码
重新编译,将生成的ErrorReportValve.class替换掉原始的tomcat-embed-core的jar包。

解决!
在这里插入图片描述
在这里插入图片描述
修复完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/550873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人类连接的桥梁:探索Facebook如何连接世界

随着技术的发展和全球化的进程&#xff0c;我们的世界正在变得越来越紧密相连。在这个过程中&#xff0c;社交媒体平台扮演了一个至关重要的角色&#xff0c;为人们提供了一个跨越国界、文化和语言的交流平台。其中&#xff0c;Facebook作为全球最大的社交媒体平台&#xff0c;…

学习BOM

目录 前言: 1. BOM组成&#xff1a; 1.1Window 对象&#xff1a; 1.1Location 对象&#xff1a; 1.2Navigator 对象&#xff1a; 1.2.1 navigator 对象包含了关于浏览器的信息包括&#xff1a; 1.3History 对象&#xff1a; 1.4常用的history的方法和属性: 1.4Document…

手写spring IOC底层源码来模拟spring如何利用多级缓存解决循环依赖的问题

在文章开始之前&#xff0c;先来看一张spring IOC加载过程的脑图吧 Spring IOC的加载过程 首先,当我们去new了一个applicationContext,它底层呢就会把我们配置的bean进行扫描,然后创建成一个一个的beanDefinition放在我们的beanDefinitionMap中,此时就有了一切创造bean的原料信…

智慧园区解决方案一站式资料大全:标准规范顶层设计指南、供应商整体解决方案及售前PPT、标准白皮书、全国前50智慧园区集成商方案等全套600份,一次性打包下载

关键词&#xff1a;智慧园区解决方案&#xff0c;智慧园区整体解决方案&#xff0c;智慧园区建设总体方案设计&#xff0c;智慧园区综合管理系统&#xff0c;智慧产业园区解决方案&#xff0c;智慧产业园区规划方案&#xff0c;智慧园区建设规划方案&#xff0c;智慧工业园区建…

【数据结构1-基本概念和术语】

这里写自定义目录标题 0.数据&#xff0c;数据元素&#xff0c;数据项&#xff0c;数据对项&#xff0c;数据结构&#xff0c;逻辑结构&#xff0c;存储结构1.结构1.1逻辑结构1.2存储结构1.2.1 顺序结构1.2.2链式结构 1.3数据结构1.3.1基本数据类型1.3.2抽象数据类型1.3.2.1一个…

基于ssm幼儿资源互助共享平台的设计论文

目 录 摘 要 I Abstract II 第1章 前 言 2 1.1 研究背景 3 1.2 研究现状 3 1.3 系统开发目标 3 第2章 系统开发环境 5 2.1 SSM框架 5 2.2 JAVA简介 6 2.3 ECLIPSE 开发环境 7 2.4 Tomcat服务器 7 2.5 MySQL数据库 7 第3章 需求分析 9 3.1 需求分析 9 3.2 系统可行性分析 9 3.3…

ICV:《中美量子产业融资比较分析》

近日&#xff0c;全球前沿科技咨询公司ICV发布了A Comparative Analysis of Quantum Industry Financing in the U.S and China&#xff08;美国和中国量子产业融资比较分析&#xff09;报告。该报告旨在对中美两国在量子技术领域的投融资情况进行比较分析&#xff0c;探讨其差…

服务器数据恢复—xfs文件系统节点、目录项丢失的数据恢复案例

服务器数据恢复环境&#xff1a; EMC某型号存储&#xff0c;该存储内有一组由12块磁盘组建的raid5阵列&#xff0c;划分了两个lun。 服务器故障&#xff1a; 管理员为服务器重装操作系统后&#xff0c;发现服务器的磁盘分区发生改变&#xff0c;原来的sdc3分区丢失。由于该分区…

目标检测算法——YOLOV9——算法详解

一、主要贡献 深度网络输入数据在逐层进行特征提取和空间变换时&#xff0c;会丢失大量的信息。针对 信息丢失问题&#xff0c;研究问题如下&#xff1a; 1&#xff09;从可逆功能的角度对现有深度神经网络架构进行了理论分析&#xff0c;解释了许多过去难以解释的现象&#xf…

绝地求生:PCL大名单公布,艾伦格三巨头惨遭拆散

就在4.16号PCL官博公布了春季赛的参赛大名单&#xff0c;此次比赛不再像以前一样分为艾伦格、米拉玛和维寒迪三组&#xff0c;而是重新打乱分成了A、B、C三组。 具体名单如下 不仅多了很多新战队&#xff0c;还有一些老家伙也回到了赛场上&#xff0c;比如四大名捕的TSG。

机器学习和深度学习--李宏毅(笔记与个人理解)Day17

Day 17Convolutional Neyral Network (CNN) 卷积神经网络一般都用在image 上面比较多一些&#xff0c;所以课程的例子大多数也都是image Image Classification the same size how about for pc? 这里对于tensor 张量这个概念&#xff0c;我还是比较奇怪&#xff0c;在我认为一…

算法思想总结:链表

一、链表的常见技巧总结 二、两数相加 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {//利用t来存进位信息int t0;ListNode*newheadnew ListNode(0);//创建一个哨兵节点&#xff0c;方便尾插List…

网工基础协议——TCP/UDP协议

TCP和UDP的不同点&#xff1a; TCP(Transmission Control Protocol&#xff0c;传输控制协议)&#xff1b; UDP(User Data Protocol&#xff0c;用户数据报协议)&#xff1b; TCP&#xff1a;传输控制协议&#xff0c;面向连接可靠的协议&#xff0c;只能适用于单播通信&…

【教程】一个比较良心的C++代码混淆器

这是一个比较良心的C代码混淆器&#xff0c;用于信息竞赛训练和保护代码免受抄袭。本文将介绍这个混淆器的使用方法、混淆效果和已知的一些bug。同时&#xff0c;我们也会给出一些示例来演示混淆器的具体操作。 引言 在信息竞赛训练和实际开发中&#xff0c;保护代码的安全性和…

闲不住,手写一个数据库文档生成工具

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 逛博客的时候&#xff0c;发现了一个很有意思的文章&#xff1a;数据库表结构导…

JL-32 土壤速测仪 手持便携可移动 多要素参数可选配

产品概述 土壤速测仪是一款携带方便&#xff0c;操作简单&#xff0c;集采集与存储于一体的可移动式观测仪器。由手持式速测主机、土壤类传感器、USB数据线、电源适配器、便携式手提箱等部分组成。速测仪主机可通过集线器接入不同类型的传感器&#xff0c;互不影响精度&#x…

【二分查找】Leetcode 74. 搜索二维矩阵【中等】

搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c…

记录Python链接mysql数据的增删改查方法

一、添加方法 db pymysql.connect(hostlocalhost,userroot,password123456,dbpython) cursor db.cursor() sql """insert into EMPLOYEEVALUES(3,张,天爱,35,F,8000) """ try:cursor.execute(sql)db.commit() #提交后&#xff0c;数据才会变 …

Springboot+Vue项目-基于Java+MySQL的网上超市系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Jackson 2.x 系列【28】Spring Boot 集成之 Long 精度损失

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 问题场景2. 原因分析3. 解决方案4. 案例演示4.…