Play-pac4j Twitter身份验证过期并引发异常

Play-pac4j Twitter身份验证过期并引发异常,twitter,twitter-oauth,playframework-2.3,Twitter,Twitter Oauth,Playframework 2.3,我看到很多TwitterClient会话都过期了,结果出现了一个异常。据我所知,twitter oAuth会话不会过期,所以我想知道是什么导致了这个问题?我使用memcache来存储用户会话,因为我们的站点可以跨多个实例进行扩展,这可能是造成问题的原因,但我在移动到memcache之前看到了这种行为,所以我相信这可能是其他原因造成的 理想情况下,我正在寻找可能导致这种情况的想法,以便我能够修复它,但在短期内,如果有人能告诉我如何拦截此异常并进行处理,以便我的用户不会看到错误屏幕,我将不胜感激 我

我看到很多TwitterClient会话都过期了,结果出现了一个异常。据我所知,twitter oAuth会话不会过期,所以我想知道是什么导致了这个问题?我使用memcache来存储用户会话,因为我们的站点可以跨多个实例进行扩展,这可能是造成问题的原因,但我在移动到memcache之前看到了这种行为,所以我相信这可能是其他原因造成的

理想情况下,我正在寻找可能导致这种情况的想法,以便我能够修复它,但在短期内,如果有人能告诉我如何拦截此异常并进行处理,以便我的用户不会看到错误屏幕,我将不胜感激

我正在使用play 2.3.3和play-pac4j 1.6

 ERROR o.p.oauth.client.BaseOAuth10Client: Token request expired
  ERROR play: Cannot invoke the action, eventually got an error: org.pac4j.oauth.client.exception.OAuthCredentialsException: Token request expired
  ERROR application: 
  ! @6lhge4dme - Internal server error, for (GET) [/league/callback?client_name=TwitterClient&oauth_token=tgk8pilQpkwlgt5kU01ieK1lgMO33Vv0&oauth_verifier=DhE9aFaVxsbSWmm7SN34IrNHR3gcixbe] ->
  play.api.Application$$anon$1: Execution exception[[OAuthCredentialsException: Token request expired]]
    at play.api.Application$class.handleError(Application.scala:296) ~[com.typesafe.play.play_2.10-2.3.5.jar:2.3.5]
    at play.core.server.servlet.DefaultWarApplication.handleError(Play2Server.scala:118) [com.github.play2war.play2-war-core-common_2.10-1.3-beta2.jar:1.3-beta2]
    at play.core.server.servlet.Play2GenericServletRequestHandler$$anonfun$1$$anonfun$applyOrElse$7.apply(RequestHandler.scala:376) [com.github.play2war.play2-war-core-common_2.10-1.3-beta2.jar:1.3-beta2]
    at play.core.server.servlet.Play2GenericServletRequestHandler$$anonfun$1$$anonfun$applyOrElse$7.apply(RequestHandler.scala:376) [com.github.play2war.play2-war-core-commo...
 ...n_2.10-1.3-beta2.jar:  1.3-beta2]
 ...n_2.10-1.3-beta2.jar:   at scala.Option.fold(Option.scala:157) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...n_2.10-1.3-beta2.jar:   at play.core.server.servlet.Play2GenericServletRequestHandler$$anonfun$1.applyOrElse(RequestHandler.scala:375) [com.github.play2war.play2-war-core-common_2.10-1.3-beta2.jar:1.3-beta2]
 ...n_2.10-1.3-beta2.jar:   at play.core.server.servlet.Play2GenericServletRequestHandler$$anonfun$1.applyOrElse(RequestHandler.scala:372) [com.github.play2war.play2-war-core-common_2.10-1.3-beta2.jar:1.3-beta2]
 ...n_2.10-1.3-beta2.jar:   at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...n_2.10-1.3-beta2.jar:   at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...n_2.10-1.3-beta2.jar:   at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...n_2.10-1.3-beta2.jar:   at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46) [com.typesafe.play.play-iteratees_2.10-2.3.5.jar:2.3.5...
 ...:  ]
 ...:   at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...:   at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...:   at scala.concurrent.Promise$class.complete(Promise.scala:55) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...:   at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...:   at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...:   at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:40) [com.typesafe.play.play_2.10-2.3.5.jar:2.3.5]
 ...:   at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) [com.typesafe.akka.akka-actor_2.10-2.3.4.jar:na]
 ...:   at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) [com.typesafe.akka.akka-...
 ...actor_2.10-2.3.4.jar:  na]
 ...actor_2.10-2.3.4.jar:   at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...actor_2.10-2.3.4.jar:   at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...actor_2.10-2.3.4.jar:   at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...actor_2.10-2.3.4.jar:   at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...actor_2.10-2.3.4.jar:  Caused by: org.pac4j.oauth.client.exception.OAuthCredentialsException: Token request expired
 ...actor_2.10-2.3.4.jar:   at org.pac4j.oauth.client.BaseOAuth10Client.getAccessToken(BaseOAuth10Client.java:100) ~[org.pac4j.pac4j-oauth-1.6.0.jar:na]
 ...actor_2.10-2.3.4.jar:   at org.pac4j.oauth.client.BaseOAuthClient.retrieveUserProfile(BaseOAuthClient.java:166) ~[org.pac4j.pac4j-oauth-1.6.0.jar:na]
 ...actor_2.10-2.3.4.jar:   at org.pac4j.oauth.client.BaseOAuthClient.retrieveUserProfile(BaseOAuthClient.java:45) ~[org.pa...
 ...c4j.pac4j-oauth-1.6.0.jar:  na]
 ...c4j.pac4j-oauth-1.6.0.jar:      at org.pac4j.core.client.BaseClient.getUserProfile(BaseClient.java:231) ~[org.pac4j.pac4j-core-1.6.0.jar:na]
 ...c4j.pac4j-oauth-1.6.0.jar:      at org.pac4j.play.CallbackController$1.apply(CallbackController.java:95) ~[org.pac4j.play-pac4j_java-1.3.0.jar:na]
 ...c4j.pac4j-oauth-1.6.0.jar:      at org.pac4j.play.CallbackController$1.apply(CallbackController.java:69) ~[org.pac4j.play-pac4j_java-1.3.0.jar:na]
 ...c4j.pac4j-oauth-1.6.0.jar:      at play.core.j.FPromiseHelper$$anonfun$promise$2.apply(FPromiseHelper.scala:36) ~[com.typesafe.play.play_2.10-2.3.5.jar:2.3.5]
 ...c4j.pac4j-oauth-1.6.0.jar:      at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...c4j.pac4j-oauth-1.6.0.jar:      at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [org.scala-lang.scala-library-2.10.4.jar:na]
 ...c4j.pac4j-oauth-1.6.0.jar:      ... 7 common frames omitted

我找到了我的一个问题的答案,即如何拦截异常,但我仍然不太确定是什么原因导致了这种情况,因为我无法复制它,尽管它在我的日志中出现的频率比我希望的要高

拦截异常非常简单,只需覆盖Global.java中的onError()方法并处理异常

@Override
    public Promise<Result> onError(RequestHeader req, Throwable t) {
        //Check for session timeout for Twitter Clients and log them out if something is wrong.
        if(t instanceof OAuthCredentialsException){
            Logger.warn("[LiveError] OAuthException: Loguser out.",t);

            //Attempt to log user out and go to logging page
            return Promise.<Result>pure(org.pac4j.play.CallbackController.logoutAndRedirect());
        }

        Logger.warn("[LiveError] Encountered an unexpected error,",t);
        return Promise.<Result>pure(internalServerError(views.html.league.error.render("Sorry, we have an error!  "+t.getMessage())));
    }
@覆盖
公共承诺接收者(请求头请求,可丢弃的t){
//检查Twitter客户端的会话超时,如果出现问题,请将其注销。
if(OAuthCredentialsException的t实例){
Logger.warn(“[LiveError]OAutheException:Loguser out.”,t);
//尝试注销用户并转到日志页面
return Promise.pure(org.pac4j.play.CallbackController.logoutAndRedirect());
}
Logger.warn(“[LiveError]遇到意外错误,”,t);
返回Promise.pure(internalServerError(views.html.league.error.render)(“对不起,我们有一个错误!”+t.getMessage());
}
以下是我得到答案的参考资料: