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.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.(ZipFile.java:205) at java.util.zip.ZipFile.(ZipFile.java:144) at java.util.jar.JarFile.(JarFile.java:152) at java.util.jar.JarFile.(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) 

我做了很多搜索,有些人说从sturts.xml文件中删除了这个属性值

  

有人说将值从true更改为false。 我做到了但它没有用。 请给出一个解决方案。 我也改变了jar文件并使用了2.1.8版本,但在此我得到了启动服务器的exception

 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) 

我也使用以下带有struts jar文件的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 

请指导我。

从我的调查中

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

只有在尝试在Google App Engine for Windows上运行Struts 2应用程序时才会出现exception。

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

为了在Google App Engine for Windows下运行时解决这个问题, 我找到的唯一可行解决方案是实现一个自定义插件/扩展点 ,实现以下接口com.opensymphony.xwork2.FileManager和com.opensymphony.xwork2.FileManagerFactory

在插件中实现上述接口的类会覆盖Struts 2默认实例化的实现,即DefaultFileManager和DefaultFileManagerFactory

我创建的自定义文件插件有三个主要组件:

  1. struts-plugin.xml文件指定应将插件中的FileManager和FileManagerFactory实现视为默认值
  2. Struts2FileManagerFactoryOnGAE ,FileManagerFactory接口的自定义实现,其中唯一从DefaultFileManagerFactory实现的更改是类名
  3. Struts2FileManagerOnGAE ,自定义FileManager实现,我在那里做了必要的修改,即fileNeedsReloading()方法和内部应该返回false,而support()方法应该返回true。

此外,在我添加的应用程序的WEB-INF / web.xml中: config struts-default.xml,struts-plugin.xml,struts.xml

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

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

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

ant dev_appserver

在build.xml中设置Google App Engine SDK的路径后,您可以在此处看到它http://struts-gae.appspot.com/jsp/index.jsp

该应用程序的作用是:你需要猜测生成的随机数,经过几次尝试后它会显示一个提示,当你猜出它的数字时,它会显示你已经猜到了多少次尝试。

打开\lib\security\java.policy文件,然后在授权条目中添加所需的权限:

  permission java.io.FilePermission "E:/eclipse/Shaun/Convergent/-" , "read" 

仅供参考我使用以下struts2和x-work jar文件,它解决了我的问题。

http://mvnrepository.com/artifact/org.apache.struts/struts2-core/2.2.1 http://mvnrepository.com/artifact/org.apache.struts.xwork/xwork-core/2.2.1

并在struts.xml文件中添加此行