最近很多小伙伴都在问基于SpringBoot+方法的分层角色安全性:ServletContext是必需的和springboot分层设计这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓
最近很多小伙伴都在问基于SpringBoot +方法的分层角色安全性:ServletContext是必需的和springboot分层设计这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展idea 启动 springboot 项目 报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader () L...、JSP PageContext.getServletContext()方法——返回ServletContext的实例、JSP Response.getServletContext()方法:返回session所属的ServletContext对象、org.springframework.boot.context.embedded.ServletContextInitializer的实例源码等相关知识,下面开始了哦!
本文目录一览:- 基于SpringBoot +方法的分层角色安全性:ServletContext是必需的(springboot分层设计)
- idea 启动 springboot 项目 报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader () L...
- JSP PageContext.getServletContext()方法——返回ServletContext的实例
- JSP Response.getServletContext()方法:返回session所属的ServletContext对象
- org.springframework.boot.context.embedded.ServletContextInitializer的实例源码
基于SpringBoot +方法的分层角色安全性:ServletContext是必需的(springboot分层设计)
我添加了 基于方法的安全性 并添加了 角色层次结构 。在构建过程中,我不断收到以下异常:
org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.web.servlet.HandlerMapping]:工厂方法’defaultServletHandlerMapping’抛出异常;嵌套的异常是java.lang.IllegalArgumentException:
需要ServletContext来配置默认的Servlet处理
我尝试了许多不同的配置替代方法,但均无济于事…这是我的基本Web安全配置类(如您所见,我添加了与角色层次结构相关的bean):
@Configuration@EnableWebSecuritypublic class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {(...)@Overrideprotected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity .csrf() .disable() (...) .expressionHandler(webExpressionHandler()) (...) .anyRequest().authenticated(); httpSecurity .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);}@Beanpublic SecurityExpressionHandler<FilterInvocation> webExpressionHandler() { DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler(); defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy()); return defaultWebSecurityExpressionHandler;}@Beanpublic RoleHierarchy roleHierarchy() { RoleHierarchyImpl r = new RoleHierarchyImpl(); r.setHierarchy(Role.getHierarchy()); return r;}(...)}
这是我基于此线程创建的单独的配置文件:
@Configuration@EnableGlobalMethodSecurity(prePostEnabled = true)public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration { @Autowired private RoleHierarchy roleHierarchy; @Override protected MethodSecurityExpressionHandler createExpressionHandler() { DefaultMethodSecurityExpressionHandler expressionHandler = (DefaultMethodSecurityExpressionHandler) super.createExpressionHandler(); expressionHandler.setRoleHierarchy(roleHierarchy); return expressionHandler; }}
我为此奋斗了许多小时。我尝试过的相关主题在这里:
- Spring Boot + Spring Security +分层角色
- 创建名称为’defaultServletHandlerMapping的bean时出错
- 创建名称为defaultServletHandlerMapping的bean时出错
每一个帮助表示赞赏!
答案1
小编典典好,找到了。
我研究了类注释,并得出了一个简单的解决方案:我@EnableGlobalMethodSecurity
从GlobalMethodSecurityConfig中删除了它,并将其移到了以前的WebSecurityConfiguration中。所以看起来像这样:
@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true)public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { (...) }
和这个:
@Configurationpublic class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration { (...) }
最有趣的部分是,从这里接受的答案可以告诉我哪些对我不起作用。
idea 启动 springboot 项目 报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader () L...
有一次启动 springboot 项目的时候,报了一个非常奇怪的错误,说是找不到 servletContext,springboot 不是自带 tomcat 的吗?
在网上找了好久,说是用以下方式解决。
解决方式:
将 tomcat 的 lib 包下的 servlet-api.jar 拷贝到 java 的 jre 下的 lib 里即可。(需要在 idea 中重新导入一下 jdk)
mac 电脑下寻找 java 安装目录方式:在终端下执行
/usr/libexec/java_home -V
但是查看同事的 java 的 jre 包下并没有这个 jar,但是人家都能启动起来。这个就不知到为什么了?
虽然自己解决了这个问题,却不知所以然。。。。
后来我发现我们的项目里用的是 undertow 服务器,难道是跟这个有关系吗?
2. 另一种解决方式:
今天将项目的服务器由 tomcat 换成 undertow, 发现项目在本地可以启动成功,但是发不到服务器就启动不成功,就报跟上面同样的错误,原来是我本地的 jre 环境有 sevlet-api,但是我不能也往服务器的 jre 也放同样的吧,毕竟这样不合理。后来就查找原因,原来是 undertow 的 jar 包中已经有了 sevlet-api 3.1 版本的,但是为何启动不成功呢,原来我的另一个 jar 包中也有 sevlet-api,而且还是 2.5 版本的,
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>
项目在启动的时候优先找到了2.5版本的,而2.5版本的ServletContext类里没有getClassLoader这个方法,所以才报的错,解决方式是将2.5版本的排除,服务器就启动成功了。
总结:看来maven项目的依赖还得多研究。
JSP PageContext.getServletContext()方法——返回ServletContext的实例
该方法返回 ServletContext 的实例。语法:
getServletContext()
返回值:返回 ServletContext 的实例。示例
获取 ServletContext 的实例,关键代码如下:<% ServletContext sc = pageContext.getServletContext(); %>
JSP Response.getServletContext()方法:返回session所属的ServletContext对象
该方法用于返回 session 所属的 ServletContext 对象。语法:
getServletContext()
返回值:ServletContext 对象。示例
获取 ServletContext 对象,关键代码如下:<% ServletContext sc = session.getServletContext(); %>
org.springframework.boot.context.embedded.ServletContextInitializer的实例源码
@Override public EmbeddedServletContainer getEmbeddedServletContainer( ServletContextinitializer... initializers) { Tomcat tomcat = new Tomcat(); File baseDir = (this.baseDirectory != null ? this.baseDirectory : createTempDir("tomcat")); tomcat.setBaseDir(baseDir.getAbsolutePath()); Connector connector = new Connector(this.protocol); tomcat.getService().addConnector(connector); customizeConnector(connector); tomcat.setConnector(connector); tomcat.getHost().setAutoDeploy(false); tomcat.getEngine().setBackgroundProcessorDelay(-1); for (Connector additionalConnector : this.additionalTomcatConnectors) { tomcat.getService().addConnector(additionalConnector); } prepareContext(tomcat.getHost(),initializers); return getTomcatEmbeddedServletContainer(tomcat); }
@Bean public ServletContextinitializer servletContextinitializer() { return new ServletContextinitializer() { @Override public void onStartup(ServletContext servletContext) throws servletexception { String loggingServerIP = portalConfig.cloggingUrl(); String loggingServerPort = portalConfig.cloggingPort(); String credisServiceUrl = portalConfig.credisServiceUrl(); servletContext.setinitParameter("loggingServerIP",Strings.isNullOrEmpty(loggingServerIP) ? "" : loggingServerIP); servletContext.setinitParameter("loggingServerPort",Strings.isNullOrEmpty(loggingServerPort) ? "" : loggingServerPort); servletContext.setinitParameter("credisServiceUrl",Strings.isNullOrEmpty(credisServiceUrl) ? "" : credisServiceUrl); } }; }
@Override public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextinitializer... initializers) { ClassLoader parentClassLoader = resourceLoader != null ? resourceLoader.getClassLoader() : ClassUtils.getDefaultClassLoader(); Package nettyPackage = Bootstrap.class.getPackage(); String title = nettyPackage.getImplementationTitle(); String version = nettyPackage.getImplementationVersion(); logger.info("Running with " + title + " " + version); NettyEmbeddedContext context = new NettyEmbeddedContext(getcontextpath(),new urlclassloader(new URL[]{},parentClassLoader),SERVER_INFO); if (isRegisterDefaultServlet()) { logger.warn("This container does not support a default servlet"); } for (ServletContextinitializer initializer : initializers) { try { initializer.onStartup(context); } catch (servletexception e) { throw new RuntimeException(e); } } int port = getPort() > 0 ? getPort() : new Random().nextInt(65535 - 1024) + 1024; InetSocketAddress address = new InetSocketAddress(port); logger.info("Server initialized with port: " + port); return new NettyEmbeddedServletContainer(address,context); }
@Bean public ServletContextinitializer servletContextinitializer() { return new ServletContextinitializer() { @Override public void onStartup(ServletContext servletContext) throws servletexception { String loggingServerIP = portalConfig.cloggingUrl(); String loggingServerPort = portalConfig.cloggingPort(); String credisServiceUrl = portalConfig.credisServiceUrl(); servletContext.setinitParameter("loggingServerIP",Strings.isNullOrEmpty(credisServiceUrl) ? "" : credisServiceUrl); } }; }
/** * Configure the Tomcat {@link Context}. * @param context the Tomcat context * @param initializers initializers to apply */ protected void configureContext(Context context,ServletContextinitializer[] initializers) { TomcatStarter starter = new TomcatStarter(initializers); if (context instanceof TomcatEmbeddedContext) { // Should be true ((TomcatEmbeddedContext) context).setStarter(starter); } context.addServletContainerInitializer(starter,NO_CLASSES); for (LifecycleListener lifecycleListener : this.contextLifecycleListeners) { context.addLifecycleListener(lifecycleListener); } for (Valve valve : this.contextValves) { context.getPipeline().addValve(valve); } for (ErrorPage errorPage : getErrorPages()) { new TomcatErrorPage(errorPage).addToContext(context); } for (MimeMappings.Mapping mapping : getMimeMappings()) { context.addMimeMapping(mapping.getExtension(),mapping.getMimeType()); } configureSession(context); for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) { customizer.customize(context); } }
@Override public void onStartup(Set<Class<?>> classes,ServletContext servletContext) throws servletexception { try { for (ServletContextinitializer initializer : this.initializers) { initializer.onStartup(servletContext); } } catch (Exception ex) { this.startUpException = ex; // Prevent Tomcat from logging and re-throwing when we kNow we can // deal with it in the main thread,but log for information here. if (logger.isErrorEnabled()) { logger.error("Error starting Tomcat context: " + ex.getClass().getName()); } } }
/** * Configure the given Jetty {@link WebAppContext} for use. * @param context the context to configure * @param initializers the set of initializers to apply */ protected final void configureWebAppContext(WebAppContext context,ServletContextinitializer... initializers) { Assert.notNull(context,"Context must not be null"); context.setTempDirectory(getTempDirectory()); if (this.resourceLoader != null) { context.setClassLoader(this.resourceLoader.getClassLoader()); } String contextpath = getcontextpath(); context.setcontextpath(StringUtils.hasLength(contextpath) ? contextpath : "/"); context.setdisplayName(getdisplayName()); configureDocumentRoot(context); if (isRegisterDefaultServlet()) { addDefaultServlet(context); } if (shouldRegisterJspServlet()) { addJspServlet(context); } ServletContextinitializer[] initializersToUse = mergeInitializers(initializers); Configuration[] configurations = getWebAppContextConfigurations(context,initializersToUse); context.setConfigurations(configurations); configureSession(context); postProcessWebAppContext(context); }
/** * public void onStartup(ServletContext servletContext) throws servletexception { * LightAdmin.configure(servletContext) * .basePackage("org.lightadmin.boot.administration") * .baseUrl("/admin") * .security(false) * .backToSiteUrl("http://lightadmin.org"); * super.onStartup(servletContext); * } */ /* Used for running in "embedded" mode */ @Bean public ServletContextinitializer servletContextinitializer() { return new ServletContextinitializer() { @Override public void onStartup(ServletContext servletContext) throws servletexception { LightAdmin.configure(servletContext) //.basePackage("org.lightadmin.boot.administration") .baseUrl("/lightadmin") .security(false) .backToSiteUrl("http://lightadmin.org"); new LightAdminWebApplicationInitializer().onStartup(servletContext); } }; }
@Override public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextinitializer... initializers) { ClassLoader parentClassLoader = resourceLoader != null ? resourceLoader.getClassLoader() : ClassUtils.getDefaultClassLoader(); Package nettyPackage = Bootstrap.class.getPackage(); String title = nettyPackage.getImplementationTitle(); String version = nettyPackage.getImplementationVersion(); logger.info("Running with " + title + " " + version); NettyEmbeddedContext context = new NettyEmbeddedContext(getcontextpath(),SERVER_INFO); if (isRegisterDefaultServlet()) { logger.warn("This container does not support a default servlet"); } if (isRegisterJspServlet()) { logger.warn("This container does not support a JSP servlet"); } for (ServletContextinitializer initializer : initializers) { try { initializer.onStartup(context); } catch (servletexception e) { throw new RuntimeException(e); } } int port = getPort() > 0 ? getPort() : new Random().nextInt(65535 - 1024) + 1024; InetSocketAddress address = new InetSocketAddress(port); logger.info("Server initialized with port: " + port); return new NettyEmbeddedServletContainer(address,context); }
/** * public void onStartup(ServletContext servletContext) throws servletexception { * LightAdmin.configure(servletContext) * .basePackage("org.lightadmin.boot.administration") * .baseUrl("/admin") * .security(false) * .backToSiteUrl("http://lightadmin.org"); * super.onStartup(servletContext); * } */ /* Used for running in "embedded" mode */ @Bean public ServletContextinitializer servletContextinitializer() { return new ServletContextinitializer() { @Override public void onStartup(ServletContext servletContext) throws servletexception { LightAdmin.configure(servletContext) .basePackage("org.lightadmin.boot.administration") .baseUrl("/admin") .security(true) .backToSiteUrl("http://lightadmin.org"); new LightAdminWebApplicationInitializer().onStartup(servletContext); } }; }
@Bean public ServletContextinitializer servletContextinitializer() { return servletContext -> { servletContext.setinitParameter("com.sun.faces.forceLoadConfiguration",Boolean.TRUE.toString()); servletContext.setinitParameter("javax.faces.FACELETS_SKIP_COMMENTS",Boolean.TRUE.toString()); servletContext.setinitParameter("primefaces.CLIENT_SIDE_VALIDATION","true"); servletContext.setinitParameter("javax.faces.PROJECT_STAGE","Development"); servletContext.addListener(com.sun.faces.config.ConfigureListener.class); servletContext.setinitParameter("BootsFaces_THEME","default"); }; }
@Bean public ServletContextinitializer servletContextinitializer() { return servletContext -> { servletContext.setinitParameter("com.sun.faces.forceLoadConfiguration",Boolean.TRUE.toString()); }; }
@Bean public ServletContextinitializer servletContextinitializer() { return servletContext -> { servletContext.setinitParameter("com.sun.faces.forceLoadConfiguration","default"); }; }
@SuppressWarnings("deprecation") @Bean public ServletContextinitializer servletContextinitializer() { return new ServletContextinitializer() { @Override public void onStartup(ServletContext servletContext) throws servletexception { servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE)); SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig(); sessionCookieConfig.setHttpOnly(true); } }; }
protected void prepareContext(Host host,ServletContextinitializer[] initializers) { File docBase = getValidDocumentRoot(); docBase = (docBase != null ? docBase : createTempDir("tomcat-docbase")); TomcatEmbeddedContext context = new TomcatEmbeddedContext(); context.setName(getcontextpath()); context.setdisplayName(getdisplayName()); context.setPath(getcontextpath()); context.setDocBase(docBase.getAbsolutePath()); context.addLifecycleListener(new FixContextListener()); context.setParentClassLoader( this.resourceLoader != null ? this.resourceLoader.getClassLoader() : ClassUtils.getDefaultClassLoader()); SkipPatternJarScanner.apply(context,this.tldSkip); WebappLoader loader = new WebappLoader(context.getParentClassLoader()); loader.setLoaderClass(TomcatEmbeddedWebappClassLoader.class.getName()); loader.setDelegate(true); context.setLoader(loader); if (isRegisterDefaultServlet()) { addDefaultServlet(context); } if (shouldRegisterJspServlet()) { addJspServlet(context); addJasperInitializer(context); context.addLifecycleListener(new StoreMergedWebXmlListener()); } ServletContextinitializer[] initializersToUse = mergeInitializers(initializers); configureContext(context,initializersToUse); host.addChild(context); postProcessContext(context); }
@Override public EmbeddedServletContainer getEmbeddedServletContainer( ServletContextinitializer... initializers) { DeploymentManager manager = createDeploymentManager(initializers); int port = getPort(); Builder builder = createBuilder(port); return new UndertowEmbeddedServletContainer(builder,manager,getcontextpath(),port,this.useForwardHeaders,port >= 0,getCompression()); }
private DeploymentManager createDeploymentManager( ServletContextinitializer... initializers) { DeploymentInfo deployment = Servlets.deployment(); registerServletContainerInitializerToDriveServletContextinitializers(deployment,initializers); deployment.setClassLoader(getServletClassLoader()); deployment.setcontextpath(getcontextpath()); deployment.setdisplayName(getdisplayName()); deployment.setDeploymentName("spring-boot"); if (isRegisterDefaultServlet()) { deployment.addServlet(Servlets.servlet("default",DefaultServlet.class)); } configureErrorPages(deployment); deployment.setServletStackTraces(ServletStackTraces.NONE); deployment.setResourceManager(getDocumentRootResourceManager()); configureMimeMappings(deployment); for (UndertowDeploymentInfoCustomizer customizer : this.deploymentInfoCustomizers) { customizer.customize(deployment); } if (isAccessLogEnabled()) { configureAccessLog(deployment); } if (isPersistSession()) { File folder = getValidSessionStoreDir(); deployment.setSessionPersistenceManager(new FileSessionPersistence(folder)); } DeploymentManager manager = Servlets.defaultContainer().addDeployment(deployment); manager.deploy(); SessionManager sessionManager = manager.getDeployment().getSessionManager(); int sessionTimeout = (getSessionTimeout() > 0 ? getSessionTimeout() : -1); sessionManager.setDefaultSessionTimeout(sessionTimeout); return manager; }
private void registerServletContainerInitializerToDriveServletContextinitializers( DeploymentInfo deployment,ServletContextinitializer... initializers) { ServletContextinitializer[] mergedInitializers = mergeInitializers(initializers); Initializer initializer = new Initializer(mergedInitializers); deployment.addServletContainerInitalizer(new ServletContainerInitializerInfo( Initializer.class,new ImmediateInstanceFactory<ServletContainerInitializer>(initializer),NO_CLASSES)); }
@Override public void onStartup(Set<Class<?>> classes,ServletContext servletContext) throws servletexception { for (ServletContextinitializer initializer : this.initializers) { initializer.onStartup(servletContext); } }
@Override public EmbeddedServletContainer getEmbeddedServletContainer( ServletContextinitializer... initializers) { JettyEmbeddedWebAppContext context = new JettyEmbeddedWebAppContext(); int port = (getPort() >= 0 ? getPort() : 0); Server server = new Server(new InetSocketAddress(getAddress(),port)); configureWebAppContext(context,initializers); if (getCompression() != null && getCompression().getEnabled()) { HandlerWrapper gzipHandler = createGzipHandler(); gzipHandler.setHandler(context); server.setHandler(gzipHandler); } else { server.setHandler(context); } this.logger.info("Server initialized with port: " + port); if (getSsl() != null && getSsl().isEnabled()) { SslContextFactory sslContextFactory = new SslContextFactory(); configureSsl(sslContextFactory,getSsl()); AbstractConnector connector = getSslServerConnectorFactory() .getConnector(server,sslContextFactory,port); server.setConnectors(new Connector[] { connector }); } for (JettyServerCustomizer customizer : getServerCustomizers()) { customizer.customize(server); } if (this.useForwardHeaders) { new ForwardHeadersCustomizer().customize(server); } return getJettyEmbeddedServletContainer(server); }
/** * Return the Jetty {@link Configuration}s that should be applied to the server. * @param webAppContext the Jetty {@link WebAppContext} * @param initializers the {@link ServletContextinitializer}s to apply * @return configurations to apply */ protected Configuration[] getWebAppContextConfigurations(WebAppContext webAppContext,ServletContextinitializer... initializers) { List<Configuration> configurations = new ArrayList<Configuration>(); configurations.add( getServletContextinitializerConfiguration(webAppContext,initializers)); configurations.addAll(getConfigurations()); configurations.add(getErrorPageConfiguration()); configurations.add(getMimeTypeConfiguration()); return configurations.toArray(new Configuration[configurations.size()]); }
private void callInitializers() throws servletexception { try { setExtendedListenerTypes(true); for (ServletContextinitializer initializer : ServletContextinitializerConfiguration.this.initializers) { initializer.onStartup(this.context.getServletContext()); } } finally { setExtendedListenerTypes(false); } }
private void triggerInitializers(ConfigurableEmbeddedServletContainer container,ServletContext servletContext) throws servletexception { verify(container,atLeastOnce()) .addInitializers(this.initializersCaptor.capture()); for (Object initializers : this.initializersCaptor.getAllValues()) { if (initializers instanceof ServletContextinitializer) { ((ServletContextinitializer) initializers).onStartup(servletContext); } else { for (ServletContextinitializer initializer : (ServletContextinitializer[]) initializers) { initializer.onStartup(servletContext); } } } }
/** * Servlet context initializer that sets a custom session cookie name. * * Otherwise,saml2sp and WSO2's Identity Server overwrite each other's session cookie if they are * both serving localhost (on different ports). This breaks the SSO flow. * * @return a context initializer that sets the session cookie name to {@code "SAML2SPSESSIONID"}. */ @Bean public ServletContextinitializer servletContextinitializer() { return new ServletContextinitializer() { @Override public void onStartup(ServletContext servletContext) throws servletexception { servletContext.getSessionCookieConfig().setName("SAML2SPSESSIONID"); } }; }
@Bean public ServletContextinitializer contextinitializer(){ ServletContextinitializer listener = new ServletContextinitializer() { @Override public void onStartup(ServletContext servletContext) throws servletexception { servletContext.setinitParameter("primefaces.THEME","glass-x"); } }; return listener; }
@Bean ServletContextinitializer noSessionTrackingServletContextinitializer() { return servletContext -> servletContext.setSessionTrackingModes(Collections.emptySet()); }
@Bean public ServletContextinitializer noSessionTrackingServletContextinitializer() { return servletContext -> servletContext.setSessionTrackingModes(Collections.emptySet()); }
TomcatStarter(ServletContextinitializer[] initializers) { this.initializers = initializers; }
Initializer(ServletContextinitializer[] initializers) { this.initializers = initializers; }
/** * Create a new {@link ServletContextinitializerConfiguration}. * @param initializers the initializers that should be invoked * @since 1.2.1 */ public ServletContextinitializerConfiguration( ServletContextinitializer... initializers) { Assert.notNull(initializers,"Initializers must not be null"); this.initializers = initializers; }
/** * Return a Jetty {@link Configuration} that will invoke the specified * {@link ServletContextinitializer}s. By default this method will return a * {@link ServletContextinitializerConfiguration}. * @param webAppContext the Jetty {@link WebAppContext} * @param initializers the {@link ServletContextinitializer}s to apply * @return the {@link Configuration} instance */ protected Configuration getServletContextinitializerConfiguration( WebAppContext webAppContext,ServletContextinitializer... initializers) { return new ServletContextinitializerConfiguration(initializers); }
关于基于SpringBoot +方法的分层角色安全性:ServletContext是必需的和springboot分层设计的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于idea 启动 springboot 项目 报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader () L...、JSP PageContext.getServletContext()方法——返回ServletContext的实例、JSP Response.getServletContext()方法:返回session所属的ServletContext对象、org.springframework.boot.context.embedded.ServletContextInitializer的实例源码等相关内容,可以在本站寻找。
本文标签: