私は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リクエスト?サーブレットが毎回新しいセッションを作成するようにします。