透過在application.properties設定對應的key-value對,可以配置Spring Boot應用程式的很多特性,例如POST、SSL、MySQL等等。如果需要更加複雜的調優,則可以利用Spring Boot提供的EmbeddedServletContainerCustomizer介面透過程式設計方式和修改配置資訊。
儘管可以透過application.properties設定server.session-timeout屬性來配置伺服器的會話超時時間,這裡我們用EmbeddedServletContainerCustomizer介面修改,來說明該介面的用法。
How Do
-
假設我們希望設定會話的超時時間為1分鐘。在WebConfiguration類中增加EmbeddedServletContainerCustomizer型別的spring bean,程式碼如下:
@Bean
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setSessionTimeout(1, TimeUnit.MINUTES);
}
};
}
-
在BookController中新增一個getSessionId(HttpServletRequest request)函式,直接傳回request.getSession().getId()。
@RequestMapping(value = "/session", method = RequestMethod.GET)
public String getSessionId(HttpServletRequest request) {
return request.getSession().getId();
}
-
透過
mvn spring-boot:run
啟動應用 -
透過postman訪問
http://localhost:8080/books/session
,得到的結果如下
1分鐘以後再次呼叫這個介面,則發現傳回的session id已經改變。
分析
除了可以使用上面這個寫法,對於使用Java 8的開發人員,還可以使用lambda運算式處理,就不需要建立一個EmbeddedServletContainerCustomizer實體了。程式碼如下:
//對於Java 8來說可以用lambda運算式,而不需要建立該介面的一個實體.
@Bean
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() {
return (ConfigurableEmbeddedServletContainer container) -> {
container.setSessionTimeout(1, TimeUnit.MINUTES);
};
}
在程式啟動階段,Spring Boot檢測到custoimer實體的存在,然後就會呼叫invoke(…)方法,並向內傳遞一個servlet物件的實體。在我們這個例子中,實際上傳入的是TomcatEmbeddedServletContainerFactory容器物件,但是如果使用Jutty或者Undertow容器,就會用對應的容器物件。