我有一個帶有嵌入式 tomcat 的 spring boot 應用程式,每當發生服務器錯誤時,我想在錯誤頁面上隱藏 apache tomcat 版本。
據我所知; 最著名的解決方案是將 server.properties 添加到 web.xml 或壓縮 catalina jar。
由于應用程式沒有 web.xml,我想不出隱藏 tomcat 版本。
Tomcat 服務器屬性更改如下,但它們都不起作用。
server.error.include-stacktrace=從不
server.error.whitelabel.enabled=false
春季啟動版本:2.5.4
請參考圖片。
謝謝!

uj5u.com熱心網友回復:
它可能與以下問題相同:
- 允許自定義 ErrorReportValve 與 Tomcat 一起使用并提供白標版本 #21257
import java.io.IOException;
import java.io.Writer;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.ActionCode;
import org.apache.tomcat.util.ExceptionUtils;
public class CustomErrorReportValve extends ErrorReportValve {
// Create a simple logger
Logger log = Logger.getLogger(CustomErrorReportValve.class.getName());
@Override
protected void report(final Request request, final Response response, final Throwable throwable) {
// ref: ErrorReportValve implementation
final int statusCode = response.getStatus();
// Do nothing on a 1xx, 2xx and 3xx status
// Do nothing if anything has been written already
// Do nothing if the response hasn't been explicitly marked as in error
// and that error has not been reported.
if (statusCode < 400 || response.getContentWritten() > 0 || !response.setErrorReported()) {
return;
}
// If an error has occurred that prevents further I/O, don't waste time
// producing an error report that will never be read
final AtomicBoolean result = new AtomicBoolean(false);
response.getCoyoteResponse().action(ActionCode.IS_IO_ALLOWED, result);
if (!result.get()) {
return;
}
try {
try {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
} catch (final Throwable t) {
ExceptionUtils.handleThrowable(t);
if (container.getLogger().isDebugEnabled()) {
container.getLogger().debug("status.setContentType", t);
}
}
final Writer writer = response.getReporter();
if (writer != null) {
// If writer is null, it's an indication that the response has
// been hard committed already, which should never happen
writer.write("<!doctype html><html lang=\"en\"><title>error</title><body>Error occured.</body></html>");
response.finishResponse();
}
} catch (IOException | IllegalStateException e) {
// Ignore
}
}
}
import org.apache.catalina.Container;
import org.apache.catalina.core.StandardHost;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyConfig {
// https://docs.spring.io/spring-boot/docs/2.5.4/reference/htmlsingle/#howto-use-tomcat-legacycookieprocessor
// https://github.com/spring-projects/spring-boot/issues/21257#issuecomment-745565376
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> errorReportValveCustomizer() {
return (factory) -> {
factory.addContextCustomizers(context -> {
final Container parent = context.getParent();
if (parent instanceof StandardHost) {
// above class FQCN
((StandardHost) parent).setErrorReportValveClass(
"com.example.foo.bar.CustomErrorReportValve");
}
});
};
}
}
uj5u.com熱心網友回復:
對于嵌入式 tomcat,我找到了覆寫錯誤報告閥的配置
現在回應沒有 tomcat 版本。
var host = (StandardHost) tomcat.getHost();
var errorReportValve = new org.apache.catalina.valves.ErrorReportValve();
errorReportValve.setShowReport(false);
errorReportValve.setShowServerInfo(false);
host.addValve(errorReportValve);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/378475.html
