通過在application.properties設(shè)置對應(yīng)的key-value對,可以配置Spring Boot應(yīng)用程序的很多特性,例如POST、SSL、MySQL等等。如果需要更加復(fù)雜的調(diào)優(yōu),則可以利用Spring Boot提供的EmbeddedServletContainerCustomizer接口通過編程方式和修改配置信息。
盡管可以通過application.properties設(shè)置server.session-timeout屬性來配置服務(wù)器的會話超時時間,這里我們用EmbeddedServletContainerCustomizer接口修改,來說明該接口的用法。
@Bean
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setSessionTimeout(1, TimeUnit.MINUTES);
}
};
}
@RequestMapping(value = "/session", method = RequestMethod.GET)
public String getSessionId(HttpServletRequest request) {
return request.getSession().getId();
}
mvn spring-boot:run
啟動應(yīng)用http://localhost:8080/books/session
,得到的結(jié)果如下1分鐘以后再次調(diào)用這個接口,則發(fā)現(xiàn)返回的session id已經(jīng)改變。
除了可以使用上面這個寫法,對于使用Java 8的開發(fā)人員,還可以使用lambda表達式處理,就不需要創(chuàng)建一個EmbeddedServletContainerCustomizer實例了。代碼如下:
//對于Java 8來說可以用lambda表達式,而不需要創(chuàng)建該接口的一個實例.
@Bean
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {
return (ConfigurableEmbeddedServletContainer container) -> {
container.setSessionTimeout(1, TimeUnit.MINUTES);
};
}
在程序啟動階段,Spring Boot檢測到custoimer實例的存在,然后就會調(diào)用invoke(...)方法,并向內(nèi)傳遞一個servlet對象的實例。在我們這個例子中,實際上傳入的是TomcatEmbeddedServletContainerFactory容器對象,但是如果使用Jutty或者Undertow容器,就會用對應(yīng)的容器對象。