springboot2如何禁用自帶tomcat的session功能
禁用自帶tomcat的session功能
微服務(wù)下的各個(gè)服務(wù)都是無狀態(tài)的,所以這個(gè)時(shí)候tomcat的session管理功能是多余的,即時(shí)不用,也會(huì)消耗性能,關(guān)閉后tomcat的性能會(huì)有提升,但是springboot提供的tomcat沒有配置選項(xiàng)可以直接關(guān)閉,研究了一下,tomcat默認(rèn)的session管理器名字叫:StandardManager,查看tomcat加載源碼發(fā)現(xiàn),如果context中沒有Manager的時(shí)候,直接new StandardManager(),源碼片段如下:
Manager contextManager = null;
Manager manager = getManager();
if (manager == null) {
if (log.isDebugEnabled()) {
log.debug(sm.getString("standardContext.cluster.noManager",
Boolean.valueOf((getCluster() != null)),
Boolean.valueOf(distributable)));
}
if ((getCluster() != null) && distributable) {
try {
contextManager = getCluster().createManager(getName());
} catch (Exception ex) {
log.error(sm.getString("standardContext.cluster.managerError"), ex);
ok = false;
}
} else {
contextManager = new StandardManager();
}
}
// Configure default manager if none was specified
if (contextManager != null) {
if (log.isDebugEnabled()) {
log.debug(sm.getString("standardContext.manager",
contextManager.getClass().getName()));
}
setManager(contextManager);
}
為了不讓tomcat去new自己的管理器,必須讓第二行的getManager()獲取到對(duì)象,所以就可以從這里入手解決,我的解決辦法如下:自定義一個(gè)tomcat工廠,繼承原來的工廠,context中加入自己寫的manager
@Component
public class TomcatServletWebServerFactorySelf extends TomcatServletWebServerFactory {
protected void postProcessContext(Context context) {
context.setManager(new NoSessionManager());
}
}
public class NoSessionManager extends ManagerBase implements Lifecycle {
@Override
protected synchronized void startInternal() throws LifecycleException {
super.startInternal();
try {
load();
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
t.printStackTrace();
}
setState(LifecycleState.STARTING);
}
@Override
protected synchronized void stopInternal() throws LifecycleException {
setState(LifecycleState.STOPPING);
try {
unload();
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
t.printStackTrace();
}
super.stopInternal();
}
@Override
public void load() throws ClassNotFoundException, IOException {
log.info("HttpSession 已經(jīng)關(guān)閉,若開啟請(qǐng)配置:seeyon.tomcat.disableSession=false");
}
@Override
public void unload() throws IOException {}
@Override
public Session createSession(String sessionId) {
return null;
}
@Override
public Session createEmptySession() {
return null;
}
@Override
public void add(Session session) {}
@Override
public Session findSession(String id) throws IOException {
return null;
}
@Override
public Session[] findSessions(){
return null;
}
@Override
public void processExpires() {}
}
兩個(gè)類解決問題,這樣通過request獲取session就是空了,tomcat擺脫session這層處理性能有所提升。
禁用內(nèi)置Tomcat的不安全請(qǐng)求方法
起因:安全組針對(duì)接口測(cè)試提出的要求,需要關(guān)閉不安全的請(qǐng)求方法,例如put、delete等方法,防止服務(wù)端資源被惡意篡改。
用過springMvc都知道可以使用@PostMapping、@GetMapping等這種注解限定單個(gè)接口方法類型,或者是在@RequestMapping中指定method屬性。這種方式比較麻煩,那么有沒有比較通用的方法,通過查閱相關(guān)資料,答案是肯定的。
tomcat傳統(tǒng)形式通過配置web.xml達(dá)到禁止不安全的http方法
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
Spring boot使用內(nèi)置tomcat,2.0版本以前使用如下形式
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {// 1
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
collection.addMethod("HEAD");
collection.addMethod("PUT");
collection.addMethod("DELETE");
collection.addMethod("OPTIONS");
collection.addMethod("TRACE");
collection.addMethod("COPY");
collection.addMethod("SEARCH");
collection.addMethod("PROPFIND");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
2.0版本使用以下形式
@Bean
public ConfigurableServletWebServerFactory configurableServletWebServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addContextCustomizers(context -> {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
collection.addMethod("HEAD");
collection.addMethod("PUT");
collection.addMethod("DELETE");
collection.addMethod("OPTIONS");
collection.addMethod("TRACE");
collection.addMethod("COPY");
collection.addMethod("SEARCH");
collection.addMethod("PROPFIND");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
});
return factory;
}
關(guān)于內(nèi)嵌tomcat的更多配置,感興趣可以閱讀官方文檔。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot集成Feign的實(shí)現(xiàn)示例
Feign是聲明式HTTP客戶端,用于簡(jiǎn)化微服務(wù)之間的REST調(diào)用,本文就來介紹一下springboot集成Feign的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
Java中Executor和Executors的區(qū)別小結(jié)
在Java并發(fā)編程中,Executor是一個(gè)核心接口,提供了任務(wù)執(zhí)行的抽象方法,而Executors是一個(gè)工具類,提供了創(chuàng)建各種線程池的工廠方法,Executor關(guān)注任務(wù)的執(zhí)行,而Executors關(guān)注如何創(chuàng)建適合的執(zhí)行器,感興趣的可以了解一下2024-10-10
selenium-java實(shí)現(xiàn)自動(dòng)登錄跳轉(zhuǎn)頁(yè)面方式
利用Selenium和Java語(yǔ)言可以編寫一個(gè)腳本自動(dòng)刷新網(wǎng)頁(yè),首先,需要確保Google瀏覽器和Chrome-Driver驅(qū)動(dòng)的版本一致,通過指定網(wǎng)站下載對(duì)應(yīng)版本的瀏覽器和驅(qū)動(dòng),在Maven項(xiàng)目中添加依賴,編寫腳本實(shí)現(xiàn)網(wǎng)頁(yè)的自動(dòng)刷新,此方法適用于需要頻繁刷新網(wǎng)頁(yè)的場(chǎng)景,簡(jiǎn)化了操作,提高了效率2024-11-11
微信公眾平臺(tái)開發(fā)實(shí)戰(zhàn)Java版之微信獲取用戶基本信息
這篇文章主要介紹了微信公眾平臺(tái)開發(fā)實(shí)戰(zhàn)Java版之微信獲取用戶基本信息 的相關(guān)資料,需要的朋友可以參考下2015-12-12
java組件commons-fileupload文件上傳示例
這篇文章主要為大家詳細(xì)介紹了java組件commons-fileupload實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
SpringBoot中將@Bean方法解析為BeanDefinition詳解
這篇文章主要介紹了SpringBoot中將@Bean方法解析為BeanDefinition詳解,得到的BeanDefinition是ConfigurationClassBeanDefinition類型,會(huì)為BeanDefinition設(shè)置factoryMethodName,這意味著當(dāng)實(shí)例化這個(gè)bean的時(shí)候?qū)⒉捎霉S方法,需要的朋友可以參考下2023-12-12

