千家信息网

springboot2怎么禁用自带tomcat的session功能

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,这篇文章主要介绍"springboot2怎么禁用自带tomcat的session功能",在日常操作中,相信很多人在springboot2怎么禁用自带tomcat的session功能问题上存在疑惑,小编
千家信息网最后更新 2024年11月19日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功能"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0