• Type: Bug
    • Resolution: Fixed
    • Priority: Major
    • 1.0.11
    • Affects Version/s: None
    • Component/s: None
    • None

      例えば以下のような遷移を行う.

      A画面 サブミット→B画面 リンク→ C画面(1)(doOnce) ポストバック遷移→ C画面(2)

      このような状況下で、C画面(2)からブラウザの戻るボタンで遷移して、
      C画面(1)にて再度doOnceのボタンを押下した場合、B画面に遷移してしまう.

      この原因はTokenのベリファイが失敗したときの挙動にある.
      基本的にはRedirect元から探すのが正解だがポストバックでの遷移でのdoOnceだった場合は、
      その画面に戻すのが正しい挙動である.

          [TEEDA-381] doOnceでTokenのベリファイに失敗した場合、ポストバック時の挙動がおかしい

          shot added a comment -

          修正しました.
          下記のように、ポストバックを見るようにしました.

              public void broadcast(FacesEvent event) throws AbortProcessingException {
                  if (TransactionTokenUtil.isDoOnce(getId())) {
                      final FacesContext context = FacesContext.getCurrentInstance();
                      if (TransactionTokenUtil.verify(context)) {
                          super.broadcast(event);
                      } else {
                          final Map requestMap = context.getExternalContext()
                                  .getRequestMap();
                          if (PostbackUtil.isPostback(requestMap)) {
                              context.renderResponse();
                              return;
                          }
                          String path = RedirectScope.getRedirectingPath(context);
                          if (path == null) {
                              path = RedirectScope.getRedirectedPath(context);
                          }
                          if (path != null) {
                              NavigationHandlerUtil.assertNotAlreadyRedirect(context);
                              NavigationHandlerUtil.redirect(context, path);
                          }
                          context.renderResponse();
                      }
                      return;
                  }
                  super.broadcast(event);
              }
          
          

          shot added a comment - 修正しました. 下記のように、ポストバックを見るようにしました. public void broadcast(FacesEvent event) throws AbortProcessingException { if (TransactionTokenUtil.isDoOnce(getId())) { final FacesContext context = FacesContext.getCurrentInstance(); if (TransactionTokenUtil.verify(context)) { super .broadcast(event); } else { final Map requestMap = context.getExternalContext() .getRequestMap(); if (PostbackUtil.isPostback(requestMap)) { context.renderResponse(); return ; } String path = RedirectScope.getRedirectingPath(context); if (path == null ) { path = RedirectScope.getRedirectedPath(context); } if (path != null ) { NavigationHandlerUtil.assertNotAlreadyRedirect(context); NavigationHandlerUtil.redirect(context, path); } context.renderResponse(); } return ; } super .broadcast(event); }

            Assignee:
            shot
            Reporter:
            shot
            Votes:
            0 Vote for this issue
            Watchers:
            Start watching this issue

              Created:
              Updated:
              Resolved: