springboot2怎么禁用自带tomcat的session功能
这篇文章主要介绍"springboot2怎么禁用自带tomcat的session功能",在日常操作中,相信很多人在springboot2怎么禁用自带tomcat的session功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"springboot2怎么禁用自带tomcat的session功能"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
禁用自带tomcat的session功能
微服务下的各个服务都是无状态的,所以这个时候tomcat的session管理功能是多余的,即时不用,也会消耗性能,关闭后tomcat的性能会有提升,但是springboot提供的tomcat没有配置选项可以直接关闭,研究了一下,tomcat默认的session管理器名字叫:StandardManager,查看tomcat加载源码发现,如果context中没有Manager的时候,直接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()获取到对象,所以就可以从这里入手解决,我的解决办法如下:自定义一个tomcat工厂,继承原来的工厂,context中加入自己写的manager
@Componentpublic 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 已经关闭,若开启请配置: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() {}}
两个类解决问题,这样通过request获取session就是空了,tomcat摆脱session这层处理性能有所提升。
禁用内置Tomcat的不安全请求方法
起因:安全组针对接口测试提出的要求,需要关闭不安全的请求方法,例如put、delete等方法,防止服务端资源被恶意篡改。
用过springMvc都知道可以使用@PostMapping、@GetMapping等这种注解限定单个接口方法类型,或者是在@RequestMapping中指定method属性。这种方式比较麻烦,那么有没有比较通用的方法,通过查阅相关资料,答案是肯定的。
tomcat传统形式通过配置web.xml达到禁止不安全的http方法
/* PUT DELETE HEAD OPTIONS TRACE BASIC
Spring boot使用内置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版本使用以下形式
@Beanpublic 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;}
到此,关于"springboot2怎么禁用自带tomcat的session功能"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!