Struts + GAE java.security.AccessControlException:拒绝访问struts2-core-2.3.15.3.jar [英] Struts + GAE java.security.AccessControlException: access denied of struts2-core-2.3.15.3.jar

查看:132
本文介绍了Struts + GAE java.security.AccessControlException:拒绝访问struts2-core-2.3.15.3.jar的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在GAE中使用struts。我正在使用GAE 1.8和struts 2.3.15 jar文件。



在我的应用程序中,我面临着这个异常

  java.security.AccessControlException:access denied(java.io.FilePermissionjar:file:\ E:\eclipse\Shaun\Convergent\war\WEB -INF\lib\struts2-core-2.3.15.3.jarread)java.security.AccessControlContext.checkPermission中的
(AccessControlContext.java:366)$ java.security.AccessController中的
.checkPermission(AccessController.java:560)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
位于com.google.appengine.tools.development.DevAppServerFactory $ CustomSecurityManager.checkPermission(DevAppServerFactory .java:431)$ java.util.zip.ZipFile上的
(SecurityManager.java:888) $ init(ZipFile.java:144)$ b $ java.util.zip.ZipFile。< init>(JarFi (JarFile.java:89)
at com.opensymphony.xwork2.util.fs.JarEntryRevision.needsReloading(JarEntryRevision());
at java.util.jar.JarFile。< init>(JarFile.java:89)
at com.opensymphony.xwork2.util.fs.JarEntryRevision.needsReloading(JarEntryRevision .java:76)
at com.opensymphony.xwork2.util.fs.DefaultFileManager.fileNeedsReloading(DefaultFileManager.java:66)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.needsReload(XmlConfigurationProvider .java:394)
at org.apache.struts2.config.StrutsXmlConfigurationProvider.needsReload(StrutsXmlConfigurationProvider.java:169)
at com.opensymphony.xwork2.config.ConfigurationManager.needReloadContainerProviders(ConfigurationManager.java:215 )
at com.opensymphony.xwork2.config.ConfigurationManager.conditionalReload(ConfigurationManager.java:179)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:73)
在org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:968)
在org.apache.struts 2.dispatcher.ng.PrepareOperations.createActionContext(PrepareOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:86)
at org。 mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at com.convergent.auth.AuthorizationFilter.doFilter(AuthorizationFilter.java:32)
at org.mortbay.jetty。 servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at com.convergent.auth.AuthenticationFilter.doFilter(AuthenticationFilter.java:48)
at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
位于com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
位于org.mortbay.jetty.servlet。 ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.jav a:123)
at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter。 java:34)
at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter( ServeBlobFilter.java:63)
at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter( TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter( StaticFileFilter.java:125)
在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
在com.google.appengine.tools.development.De vAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:368)
,位于com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:351)
com.google.appengine.tools.development。 DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler。处理(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler。 Java的:在org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765 182)

在org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:97)
at org.mortbay .jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle(JettyContainerService.java:485)
at org.mortbay .jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection $ RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547 )
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org。
at org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)

我做了很多搜索,有人说删除这个来自sturts.xml文件的属性值

 < constant name =struts.devModevalue =true/> 

有人说将值从true更改为false。我做到了,但没有奏效。请给一个解决方案。我也改变了jar文件并使用2.1.8版本,但是在这里我得到了服务器启动时的异常

  java V 
,位于org.apache.struts2.dispatcher.Dispatcher.init_DefaultProperties(Dispatcher.java:.container.addConfigurationProvider(Lcom / opensymphony / xwork2 / config / ConfigurationProvider; 310)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:411)
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69)
at org.apache.struts2.dispatcher.ng.listener.StrutsListener.contextInitialized(StrutsListener.java:45)
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)在org.mortbay.jetty.servlet.Context.startContext(Context.java:136)

在org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
在org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
在org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)在org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)

。在组织.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler .HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java :50)
,位于com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:249)
位于com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java :306)
at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java :79)
com.google。 appengine.tools.development.Modules.startup(Modules.java:88)
位于com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:254)
位于com.google。 appengine.tools.development.DevAppServerImpl.access $ 000(DevAppServerImpl.java:47)
com.google.appengine.tools.development.DevAppServerImpl $ 1.run(DevAppServerImpl.java:212)
at com。 google.appengine.tools.development.DevAppServerImpl $ 1.run(DevAppServerImpl.java:210)在java.security.AccessController.doPrivileged
(本机方法)
。在com.google.appengine.tools.development。在com.google.appengine.tools.development.DevAppServerMain $ StartAction.apply DevAppServerImpl.start(DevAppServerImpl.java:210)
(DevAppServerMain.java:277)
。在com.google.appengine.tools。 util.Parser $ ParseResult.applyArgs(Parser.java:48)
,位于com.google.appengine.tools.development.DevAppServerMain.run(DevAppServerMain.java:219)
,位于com.google.appengine。 tools.development.DevAppServerMain.main(DevAppServerMain.java:2 10)

我还在使用以下jar文件和struts jar文件

  ognl-3.0.6.jar 
sitemesh-2.4.2.jar
struts2-sitemesh-plugin-2.2.3.1.jar
xwork-core-2.3.15.3.jar

请指导我。

解决方案

从我的调查中可以看出
$ b


java.security。 AccessControlException:访问被拒绝
(java.io.FilePermission
jar:file:\ E:\eclipse\Shaun\Convergent\war\WEB-INF\lib\\ \\ struts2-core-2.3.15.3.jar
read)


例外 only尝试在Google App Engine上为 Windows 运行Struts 2应用程序时发生

在尝试将应用程序移植到GAE时,我在Windows上遇到了同样的问题,但我无法在GNU / Linux下重现它,也无法将其部署到Google服务器with appcfg.sh --auth2 update dist / myapp



为了解决在Google App Engine for Windows下运行时出现的问题,我发现唯一的工作解决方案是实施自定义插件/扩展点,以实现以下功能接口 com .opensymphony.xwork2.FileManager com.opensymphony.xwork2.FileManagerFactory



实现th e在插件内部的接口上覆盖Struts 2默认实例化的实现,即 DefaultFileManager

我创建了三个主要组件:


  1. struts-plugin.xml 文件指定从插件获得的FileManager和FileManagerFactory实现应该被视为默认值

  2. Struts2FileManagerFactoryOnGAE ,custom FileManagerFactory接口的实现,其中DefaultFileManagerFactory实现的唯一更改是类名称

  3. Struts2FileManagerOnGAE ,自定义FileManager实现,其中我做了必要的更改,即 fileNeedsReloading()方法和内部应该返回false,并且support()方法应该返回true。

WEB-INF / web.xml 我已经添加的应用程序:
< INIT-PARAM>
< param-name> config< / param-name>
< param-value> struts-default.xml,struts-plugin.xml,struts.xml< / param-value>



因为我使用Ant作为构建系统,所以我为定制文件插件,编译&将插件的jar复制到最终的工件: https:/ /gitlab.com/alibitek-java/Struts-GAE/blob/master/build.xml



您可以在我的测试应用程序的源代码中看到: https://gitlab.com/alibitek-java/Struts-GAE/tree / master>



如果您想尝试一下,您可以运行:

在build.xml中设置Google App Engine SDK的路径后,
dev_appserver



或者你可以在这里看到
http://struts-gae.appspot.com/jsp /index.jsp

应用程序的功能是:您需要猜测生成的随机数,经过几次尝试后,它会显示给您提示和wh你猜猜这个数字会告诉你你已经猜出了多少次尝试。


I am using struts in GAE. I am using GAE 1.8 and struts 2.3.15 jar file.

In my application i am facing this exception

java.security.AccessControlException: access denied ("java.io.FilePermission" "jar:file:\E:\eclipse\Shaun\Convergent\war\WEB-INF\lib\struts2-core-2.3.15.3.jar" "read")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
    at java.security.AccessController.checkPermission(AccessController.java:560)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:431)
    at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
    at java.util.zip.ZipFile.<init>(ZipFile.java:205)
    at java.util.zip.ZipFile.<init>(ZipFile.java:144)
    at java.util.jar.JarFile.<init>(JarFile.java:152)
    at java.util.jar.JarFile.<init>(JarFile.java:89)
    at com.opensymphony.xwork2.util.fs.JarEntryRevision.needsReloading(JarEntryRevision.java:76)
    at com.opensymphony.xwork2.util.fs.DefaultFileManager.fileNeedsReloading(DefaultFileManager.java:66)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.needsReload(XmlConfigurationProvider.java:394)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.needsReload(StrutsXmlConfigurationProvider.java:169)
    at com.opensymphony.xwork2.config.ConfigurationManager.needReloadContainerProviders(ConfigurationManager.java:215)
    at com.opensymphony.xwork2.config.ConfigurationManager.conditionalReload(ConfigurationManager.java:179)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:73)
    at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:968)
    at org.apache.struts2.dispatcher.ng.PrepareOperations.createActionContext(PrepareOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:86)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.convergent.auth.AuthorizationFilter.doFilter(AuthorizationFilter.java:32)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.convergent.auth.AuthenticationFilter.doFilter(AuthenticationFilter.java:48)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:368)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:351)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:97)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:485)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

I did lot of search some says remove this property value from sturts.xml file

<constant name="struts.devMode" value="true" />

Some says change the value from true to false. I did it but it didn't work. Please give a solution. I also change the jar file and use 2.1.8 version but in this i got the exception at startup of server which is

java.lang.NoSuchMethodError: com.opensymphony.xwork2.config.ConfigurationManager.addConfigurationProvider(Lcom/opensymphony/xwork2/config/ConfigurationProvider;)V
at org.apache.struts2.dispatcher.Dispatcher.init_DefaultProperties(Dispatcher.java:310)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:411)
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69)
at org.apache.struts2.dispatcher.ng.listener.StrutsListener.contextInitialized(StrutsListener.java:45)
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:249)
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:306)
at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java:79)
at com.google.appengine.tools.development.Modules.startup(Modules.java:88)
at com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:254)
at com.google.appengine.tools.development.DevAppServerImpl.access$000(DevAppServerImpl.java:47)
at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:212)
at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:210)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:210)
at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:277)
at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
at com.google.appengine.tools.development.DevAppServerMain.run(DevAppServerMain.java:219)
at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:210)

I am also using following jar files with struts jar file

ognl-3.0.6.jar
sitemesh-2.4.2.jar
struts2-sitemesh-plugin-2.2.3.1.jar
xwork-core-2.3.15.3.jar

please guide me.

解决方案

From my investigation the

java.security.AccessControlException: access denied ("java.io.FilePermission" "jar:file:\E:\eclipse\Shaun\Convergent\war\WEB-INF\lib\struts2-core-2.3.15.3.jar" "read")

exception only occurs when trying to run a Struts 2 application on Google App Engine for Windows.

I've encountered the same problem on Windows while trying to port an application to GAE, but I couldn't reproduce it under GNU/Linux nor when deployed to Google servers with appcfg.sh --oauth2 update dist/myapp

In order to solve this problem when running under Google App Engine for Windows the only working solution I found was to implement a custom plugin / extension point that implements the following interfaces com.opensymphony.xwork2.FileManager and com.opensymphony.xwork2.FileManagerFactory

The classes which implement the above interfaces inside the plugin override the implementations that Struts 2 instantiates by default, i.e. DefaultFileManager and DefaultFileManagerFactory

The custom file plugin I've created has three main components:

  1. The struts-plugin.xml file specifies that the FileManager and FileManagerFactory implementation from the plugin should be taken as the default
  2. Struts2FileManagerFactoryOnGAE, custom implemention of the FileManagerFactory interface where the only change from the DefaultFileManagerFactory implementation is the class name
  3. Struts2FileManagerOnGAE, custom FileManager implementation, where I've made the essential changes, that is, fileNeedsReloading() methods and internal should return false, and support() method should return true.

Also, inside the WEB-INF/web.xml of the application I've added: <init-param> <param-name>config</param-name> <param-value>struts-default.xml,struts-plugin.xml,struts.xml</param-value> </init-param>

Because I use Ant as a build system, I've created new targets for the custom file plugin, that compile & copy the jar of the plugin to the final artifact: https://gitlab.com/alibitek-java/Struts-GAE/blob/master/build.xml

You can see the source code for my test application at: https://gitlab.com/alibitek-java/Struts-GAE/tree/master

and if you want to give it a try you can just run:

ant dev_appserver

after setting the path to your Google App Engine SDK inside build.xml or you can see it live here http://struts-gae.appspot.com/jsp/index.jsp

What the application does is: you need to guess the random number that was generated, and after a few tries it will show you a hint, and when you guess the number it will show you in how many tries you've guessed it.

这篇关于Struts + GAE java.security.AccessControlException:拒绝访问struts2-core-2.3.15.3.jar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆