Uploaded image for project: 'Teeda'
  1. Teeda
  2. TEEDA-381

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

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.0.11
    • Component/s: None
    • Labels:
      None

      Description

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

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

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

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

        Activity

        Hide
        shot 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);
            }
        
        
        Show
        shot 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); }

          People

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

            Dates

            • Created:
              Updated:
              Resolved:

              Development