我有一个带有angular前端的spring boot with应用程序。当我使用angular应用程序发送请求,而When应用程序仍在启动时,可能会发生When应用程序可以接受该请求并尝试处理它的情况。我相信只要WebSecurityConfigurerAdapter扩展类被初始化,应用程序就能够接收请求。
当其余类尚未完全初始化时,这会导致问题。例如,当我试图注销一个仍然在前端登录的用户,而yet应用程序还在启动时,可能会因为找不到数据库表user而导致SQLException。
在初始化最后一个类(用@SpringBootApplication注释的那个类)之前,如何防止应用程序接受请求?
发布于 2020-09-08 05:19:54
根据@Fullslack.dev的提示,我提出了以下解决方案。
@WebFilter(urlPatterns = {"/*"})
public class MyFilter implements Filter, ApplicationListener<ApplicationReadyEvent> {
private boolean webApplicationReadyToAcceptRequests = false;
@Override
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
webApplicationReadyToAcceptRequests = true;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
if(!webApplicationReadyToAcceptRequests) {
httpServletResponse.setHeader("Retry-After","35");
httpServletResponse.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "The server is currently starting up. Please try again in a moment.");
return;
}
else
filterChain.doFilter(servletRequest, servletResponse);
}
}
}这是一个过滤器类,其中每个请求都必须首先通过,然后才能提供给@Controller和/或@Service注释类。如果变量webApplicationReadyToAcceptRequests仍然为假,那么过滤器将不会将请求传递到下游,而是会发送一个错误消息响应,其中包含httpstatus503(服务不可用)。
确保您至少使用以下代码注释了一个@Configuration配置类:
@ComponentScan(basePackages={ "FolderWhereMyFilterIsLocated"})这将确保spring知道过滤器的存在。
https://stackoverflow.com/questions/63779539
复制相似问题