2013-12-02 3 views
7

Я использую распорки в GAE. Я использую файл GAE 1.8 и struts 2.3.15 jar.Struts + GAE java.security.AccessControlException: доступ запрещен struts2-core-2.3.15.3.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.<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) 

Я много искать некоторые говорят удалить это значение свойства из файла sturts.xml

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

Некоторые говорят, что изменить значение от верной ложный. Я сделал это, но это не сработало. Пожалуйста, дайте решение. Я также изменить файл баночки и использовать 2.1.8 версии, но в этом я получил исключение при запуске сервера, который

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) 

Я также использую следующие опарника с распоркой банка файлом

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 

пожалуйста, направляйте меня.

+1

Вы не должны смешивать версии банки из разных выпусков. Это только приводит к сбою. –

+0

, так как я разрешаю свою проблему? –

+0

Отправьте код с помощью 'DevAppServerFactory' –

ответ

4

Из моего расследования

java.security.AccessControlException: доступ запрещен ("java.io.FilePermission" «банка: файл: \ E: \ затмение \ Shaun \ конвергентное \ войны \ WEB -INF \ Lib \ struts2-ядро-2.3.15.3.jar» "читать")

исключение только происходит при попытке запустить приложение Struts 2 на Google App Engine для Windows.

Я столкнулся с той же проблемой в Windows при попытке перенести приложение в GAE, но я не смог воспроизвести его в GNU/Linux или при развертывании на серверах Google с помощью appcfg.sh --oauth2 update dist/myapp

для того, чтобы решить эту проблему при работе в Google App Engine для Windows, единственное рабочее решение, которое я нашел в том, чтобы реализовать custom plugin/extension point, который реализует следующие интерфейсы com.opensymphony.xwork2.FileManager и com.opensymphony.xwork2.FileManagerFactory

классов, которые реализуют указанные выше интерфейсы внутри плагина переопределяют реализации th в Struts 2 конкретизирует по умолчанию, т.е. DefaultFileManager и DefaultFileManagerFactory

В custom file plugin я создал три основных компонента:

  1. Файл struts-plugin.xml указывает, что реализация FileManager и FileManagerFactory из плагина следует принимать как по умолчанию
  2. Struts2FileManagerFactoryOnGAE, пользовательская РЕАЛИЗАЦИЯ интерфейса FileManagerFactory, где единственное изменение от реализации DefaultFileManagerFactory является имя класса
  3. Struts2FileManagerOnGAE, пользовательская реализация FileManager, где я внес существенные изменения, то есть методы fileNeedsReloading() и internal должны возвращать 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> </init-param>

Поскольку я использую Ant в качестве системы сборки, я создал новые цели для пользовательского файла плагина, который компилировать & скопировать банку плагина к конечному артефакта: https://gitlab.com/alibitek-java/Struts-GAE/blob/master/build.xml

Вы можете увидеть исходный код для моего тестового приложения по адресу: https://gitlab.com/alibitek-java/Struts-GAE/tree/master

, и если вы хотите, чтобы дать ему попробовать, вы можете просто запустить:

муравей dev_appserver

после установки путь к Google App Engine SDK внутри build.xml или вы можете увидеть его вживую здесь http://struts-gae.appspot.com/jsp/index.jsp

Что делает приложение: вам нужно угадать случайное число, которое было сгенерировано, и после нескольких попыток оно покажет вам подсказку, и когда вы угадаете номер, он покажет вам, сколько попыток вы - догадался он.

+0

Спасибо Alex, вы правы, эта проблема возникает только в ОС Windows. –

1

Откройте файл <JRE location>\lib\security\java.policy, затем добавить разрешения вам нужно внутри записи в гранта:

permission java.io.FilePermission "E:/eclipse/Shaun/Convergent/-" , "read" 
Смежные вопросы