2017-09-24 9 views
1

私はSpringといくつかの簡単なページをまとめて、セッションのために持続するオブジェクトにいくつかのデータを追加したいと思います。 POSTメソッドを使用して作成されたものではなく、GETリクエストでは持続するようです。SpringでのPOSTリクエストでセッションスコープ内のオブジェクトを永続化するにはどうすればよいですか?

次のように私はUserDataの成分を有する:

package com.mycompany.controllers.components; 

import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Component; 

@Component 
@Scope("session") 
public class UserData { 

    private boolean loggedIn; 

    public UserData() { 
     loggedIn = false; 
    } 

    public boolean isLoggedIn() { 
     return loggedIn; 
    } 

    public void setLoggedIn(boolean loggedIn) { 
     this.loggedIn = loggedIn; 
    } 
} 

次のようにIは、コントローラを持っている:

package com.mycompany.controllers; 
... 
@RestController 
@Scope("session") 
public class DefaultController { 

    @Autowired 
    UserData userData; 

    ... 

    @GetMapping("/") 
    public ResponseEntity index() { 

     printUserData(userData); 

     ResponseEntity entity; 
     if((entity = authenticate(userData)) != null) { 
      return entity; 
     } 
     ... 
    } 

    @GetMapping("/setloggedIn") 
    public ResponseEntity setLoggedIn() { 

     printUserData(userData); 

     userData.setLoggedIn(true); 
    } 

    @PostMapping("/logIn") 
    public ResponseEntity logIn(@RequestBody LogInDTO dto) { 

     printUserData(userData); 
     ... 
     userData.setLoggedIn(true); 
    } 


    protected static void printUserData(UserData user) { 
     if(user== null) { 
      LOG.info("UserData is null"); 
      return; 
     } 

     LOG.info("UserData logged in: {}", user.isLoggedIn()); 
    } 
} 
  • Iが "/" UserData.isLoggedIn()の出力が偽であるに移動します期待される。

  • "/ logIn"へのポストリクエストを行うと、出力が再び期待どおりにfalseになります。いくつかのパラメータの検証に続いて、メソッドUserData.setLoggedIn(true)が呼び出されますが、「/」にナビゲートすると出力はまだfalseです。

  • "/ setLoggedIn"に移動した後、loggedInは最初はfalseですが、これもloggedInをtrueに設定すると、 "/"または "/ setLoggedIn"へのすべての要求がtrueになります。 「/ログインが」私は何かが足りないか、これは正常な動作ですアム偽

の出力を与えるために

  • さらにPOSTリクエスト?

    UPDATE 1

    私はそれが私のクッキーに保存されているJSESSIONIDに等しいことがわかりますGETリクエストにセッションIDを確認してください。 POSTリクエストごとに異なるセッションIDが表示されます。

    これは、POSTリクエストとともにJSESSIONIDを送信するにはどうすればいいですか。次のように私は現在、要求を実行しています:

    fetch('/logIn', { 
        method: 'POST', 
        body: JSON.stringify({ 
         username: txtUsername.value, 
         password: txtPassword.value 
        }), 
        headers : { 
         'Content-Type' : 'application/json' 
        } 
    }) 
    .then(result => { 
        result.text().then(function(text) { 
         if(result.status == 200) { 
          location.reload(); 
         } else { 
          alert("Error:\n" + text); 
         } 
        }); 
    }) 
    .catch(e => { 
        console.log(e); 
        alert("Error:\n" + e); 
    
    }); 
    

    UPDATE 2

    私はJSESSIONID CookieがHttpOnlyのあることがわかったとJavaScriptで読み取ることができない、それはそれはして送信されていない理由かもしれませんPOSTリクエスト?サーブレットが毎回新しいセッションを作成するようにします。

  • 答えて

    0

    fetchコマンドでは、資格情報: 'include' "がtrueに設定されている必要があります。これにより、http要求のCookieを送信することができ、サーバーは現在のセッションを解決できます。このように:

    fetch('/logIn', { 
        method: 'POST', 
        body: JSON.stringify({ 
        username: txtUsername.value, 
        password: txtPassword.value 
        }), 
        credentials: 'include', // <<< FIX 
        headers : { 
        'Content-Type' : 'application/json' 
        } 
    }) 
    .then(result => { 
        result.text().then(function(text) { 
        if(result.status == 200) { 
         location.reload(); 
        } else { 
         alert("Error:\n" + text); 
        } 
        }); 
    }) 
    .catch(e => { 
        console.log(e); 
        alert("Error:\n" + e); 
    }); 
    
    関連する問題