私はIBMWorklightプラットフォームでフォームベースの認証を実験しており、現在ここにあるチュートリアルに従っています。
初めてログインを試みるとログインページがリロードされるという奇妙な動作がありますが、まったく同じ詳細で2回目に試行すると、機能します。この動作は一貫しており、毎回再現することができます。
JSコンソールを詳しく見ると、これが印刷されていることがわかります。
openjpa-1.2.2-r422266:898935 nonfatal user error> org.apache.openjpa.persistence.InvalidStateException: The factory has been closed. The stack trace at which the factory was closed is available if Runtime=TRACE logging is enabled.
at org.apache.openjpa.kernel.AbstractBrokerFactory.assertOpen(AbstractBrokerFactory.java:673)
at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:182)
at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:142)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:192)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:145)
at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:56)
at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:434)
at $Proxy36.createEntityManager(Unknown Source)
at org.springframework.orm.jpa.EntityManagerFactoryUtils.doGetTransactionalEntityManager(EntityManagerFactoryUtils.java:195)
at org.springframework.orm.jpa.EntityManagerFactoryUtils.getTransactionalEntityManager(EntityManagerFactoryUtils.java:142)
at org.springframework.orm.jpa.EntityManagerFactoryAccessor.getTransactionalEntityManager(EntityManagerFactoryAccessor.java:129)
at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:174)
at org.springframework.orm.jpa.JpaTemplate.executeFind(JpaTemplate.java:151)
at org.springframework.orm.jpa.JpaTemplate.findByNamedQuery(JpaTemplate.java:343)
at com.worklight.core.auth.impl.AuthenticationDAO.getAssociatedIdentities(AuthenticationDAO.java:93)
at com.worklight.core.auth.impl.AuthenticationContext$1.run(AuthenticationContext.java:513)
at com.worklight.core.auth.impl.AuthenticationContext$1.run(AuthenticationContext.java:492)
at com.worklight.core.util.RssBrokerUtils.doInTransaction(RssBrokerUtils.java:123)
at com.worklight.core.auth.impl.AuthenticationContext.saveAuthenticationResult(AuthenticationContext.java:492)
at com.worklight.core.auth.impl.AuthenticationContext.processRequest(AuthenticationContext.java:244)
at com.worklight.core.auth.impl.AuthenticationFilter.doFilter(AuthenticationFilter.java:99)
at org.eclipse.equinox.http.servlet.internal.FilterRegistration.doFilter(FilterRegistration.java:81)
at org.eclipse.equinox.http.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:35)
at com.worklight.gadgets.serving.filters.AuthenticityFilter.doFilter(AuthenticityFilter.java:74)
at org.eclipse.equinox.http.servlet.internal.FilterRegistration.doFilter(FilterRegistration.java:81)
at org.eclipse.equinox.http.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:35)
at com.worklight.gadgets.serving.filters.InstanceAuthenticationFilter.doFilter(InstanceAuthenticationFilter.java:65)
at org.eclipse.equinox.http.servlet.internal.FilterRegistration.doFilter(FilterRegistration.java:81)
at org.eclipse.equinox.http.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:35)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:130)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:68)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:317)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
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.content(HttpConnection.java:939)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
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)
そのスタックトレースを検索すると、前の質問close()
SOが明らかになります。これにより、何かがを呼び出していることが示唆されていEntityManagerFactory
ます。これらはすべてWorklightで管理されるため、これがどこで/なぜ発生しているのかわかりません。
これは、認証プロセス用に私が持っているJSです。js/auth.js
var Authenticator = function() {
var LOGIN_PAGE_SECURITY_INDICATOR = 'j_security_check';
var USERNAME_INPUT_ID = '#usernameInputField';
var PASSWORD_INPUT_ID = '#passwordInputField';
var LOGIN_BUTTON_ID = '#loginButton';
function onFormSubmit() {
WL.Logger.debug("Entering auth.js.onFormSubmit()");
var reqURL = './' + LOGIN_PAGE_SECURITY_INDICATOR;
var params = {
j_username : $(USERNAME_INPUT_ID).val(),
j_password : $(PASSWORD_INPUT_ID).val()
};
onSubmitCallback(reqURL, {
parameters : params
});
}
return {
init : function() {
WL.Logger.debug("Inside auth.js.init");
$(LOGIN_BUTTON_ID).bind('click', onFormSubmit);
},
isLoginFormResponse : function(response) {
WL.Logger.debug("Inside auth.js.isLoginFormResponse " + response.responseText);
if (!response || response.responseText == null) {
WL.Logger.debug("Entering auth.js.isLoginFormResponse (), return false");
return false;
}
var indicatorIdx = response.responseText.search(LOGIN_PAGE_SECURITY_INDICATOR);
WL.Logger.debug("Entering auth.js.isLoginFormResponse (), return " + (indicatorIdx >= 0));
return (indicatorIdx >= 0);
},
onBeforeLogin : function(response, username, onSubmit, onCancel) {
WL.Logger.debug("Inside auth.js.onBeforeLogin");
onSubmitCallback = onSubmit;
onCancelCallback = onCancel;
if (typeof (username) != 'undefined' && username != null) {
$(USERNAME_INPUT_ID).val(username);
} else {
$(USERNAME_INPUT_ID).val('');
}
$(PASSWORD_INPUT_ID).val('');
},
onShowLogin : function() {
WL.Logger.debug("Inside auth.js.onShowLogin");
$.mobile.changePage("#loginPage");
},
onHideLogin : function() {
WL.Logger.debug("Inside auth.js.onHideLogin");
$.mobile.changePage("#page3");
}
};
}();
前述したように、ログインは最初は失敗し、ログインフォームをリロードするだけで、JSコンソールに上記のスタックトレースが表示されますが、2回目は正常に機能します。最初の試行では何かが正しく初期化されていないのではないかと思いますが、2回目は問題ありません。誰かが何が悪いのか提案できますか?
これらは私が使用しているページ要素です:
<div data-role="page" id="page3">
<div data-theme="a" data-role="header">
<h3>Autenticated Page - Page3</h3>
</div>
<div data-role="content">
<h3>You are logged in -Page3</h3>
<a href="#page1">Go to page1</a>
</div>
<div data-theme="a" data-role="footer">
<input type="button" value="Logout"
onclick="WL.Client.logout('SampleAppRealm', {onSuccess: WL.Client.reloadApp});" />
</div>
</div>
<div data-role="page" id="loginPage">
<div data-theme="a" data-role="header">
<h3>Hello JQuery Mobile</h3>
</div>
<div data-role="content">
<div id="loginForm">
Username:<br/>
<input type="text" id="usernameInputField" autocorrect="off" autocapitalize="off" /><br />
Password:<br/>
<input type="password" id="passwordInputField" autocorrect="off" autocapitalize="off"/><br/>
<input type="button" id="loginButton" value="Login" />
</div>
</div>
<div data-theme="a" data-role="footer">
<h3>Copyright stuff</h3>
</div>
</div>