Springboot 修改内置tomcat全局ErrorPage

Springboot 修改内置tomcat全局ErrorPage,第1张

Springboot 修改内置tomcat全局ErrorPage 一、引出

springboot 1.5.22
配置了 server.context-path=/web/v1
我们知道这时访问非该前缀的页面都会报404
现在有个需求,之前的微服客户端如何不通过额外配置,知道新服务的api前缀?
我刚开始的想法是,给一个固定api路径的接口,返回前缀信息。
但是很难做,因为在springmvc全家桶太上层,controller是由dispatcherServlet分发的,
servlet躲在container后面,tomcat的container分好多层,context-path 在context这一层。
所以不管你怎么绕着spring全家桶加东西,最后都会有/web/v1前缀

后续想法是给内置tomcat加新的context,也太复杂,否定了。

改tomcat全局的error page是不错的做法

二、ErrorReportValue

还是上面的问题,你抱着spring全家桶改诸如error handler,最后都只对/web/v1下的请求生效。
这时候搜stackoverflow,发现StandardHost一个属性 errorReportValveClass
这个class就是处理错误请求返回的页面的,那就自定义一个

public class ApiHome404ErrorPageReport extends ErrorReportValve {
	public static String API_HOME;
	@Override
	protected void report(Request request, Response response, Throwable throwable) {
		if (response.getStatus() == HttpStatus.NOT_FOUND.value()) {
			try (Writer p = response.getWriter()) {
				p.write(CommonConstatnt.API_HOME_WITH_404_PREFIX + API_HOME);
			} catch (IOException e) {
				log.error("cannot write 404 result to http response, maybe already closed by client.", e);
			}
		} else {
			super.report(request, response, throwable);
		}
	}
}
三、获取Host并设置

通过Spring提供的customizer 可以把值设置进去。

@Configuration
public class WebConfig implements TomcatContextCustomizer, EmbeddedServletContainerCustomizer {
	
	@Value("${server.context-path:/}")
	private String apiHome;	

	@Override
	public void customize(Context context) {
		if (StringUtils.isNotBlank(apiHome) && !"/".equals(apiHome.replaceAll("/+", "/"))) {
			Container parent = context.getParent();
			if (parent instanceof StandardHost) {
				ApiHome404ErrorPageReport.API_HOME = apiHome;
				((StandardHost) parent).setErrorReportValveClass(ApiHome404ErrorPageReport.class.getName());
			}
		}
	}

	@Override
	public void customize(ConfigurableEmbeddedServletContainer container) {
		if (container instanceof TomcatEmbeddedServletContainerFactory) {
			((TomcatEmbeddedServletContainer) container).addContextCutomizers(this);
		}
	}
}

以上之后就能在404时,返回目前应用的api home信息供客户端进一步 *** 作。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5709327.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存