В моем бэкэнде я аутентифицирую пользователя один раз в журнале, а затем сохраняю аутентифицированные сессии на сервере.Затем после каждого запроса пользователя я проверяю, сохраняется ли сеанс, связанный с запросом, как аутентифицированный.Проблема в том, что когда я использую запросы JavaScript, каждый раз, когда я отправляю что-то на свой сервер, написанный на Java, используется новый HTTP-сеанс.
Когда я использую Postman, все в порядке, потому что он сохраняет сеанс через множество запросов.
//Here is authentication on server side - it works fine
@CrossOrigin
@RequestMapping(value= "/login", method = RequestMethod.POST)
public @ResponseBody String login(@RequestBody Account retrievedAccount,
HttpServletRequest httpServletRequest) {
if (retrievedAccount != null) {
Account account =
accountDAO.getAccountByLogin(retrievedAccount.getLogin());
if (account != null &&
account.getPassword().equals(retrievedAccount.getPassword())) {
this.registeredSessionsContainer.add(httpServletRequest.getSession());
return new ResponseEntity(HttpStatus.OK).toString();
} else {
return new ResponseEntity(HttpStatus.UNAUTHORIZED).toString();
}
} else {
return new ResponseEntity(HttpStatus.UNAUTHORIZED).toString();
}
}
Вот простой способ проверить, аутентифицирован ли уже сеанс:
@CrossOrigin
@RequestMapping(value= "/checkLogon", method = RequestMethod.GET)
public @ResponseBody String checkLogon(HttpServletRequest
httpServletRequest) {
if(this.registeredSessionsContainer.
contains(httpServletRequest.getSession()))
return new ResponseEntity(HttpStatus.OK).toString();
} else {
return new ResponseEntity(HttpStatus.UNAUTHORIZED).toString();
}
Вот как я могу войти в службу в моем интерфейсе JavaScript:
performLoggingToService(){
var login = document.getElementById("loginField").value;
var password = document.getElementById("passwordField").value;
var url = "http://localhost:8080/mvc1/login";
var method = "POST";
var crendentialsObject = { "login": login, "password": password };
var crendentialsObjectJSON = JSON.stringify(crendentialsObject);
console.log(crendentialsObjectJSON);
var req = new XMLHttpRequest();
req.open("POST", url, true);
req.setRequestHeader("Content-Type", "application/json");
req.send(crendentialsObjectJSON);
//console.log("Is this undefined: "+(loginComponent==undefined));
var props = this.props;
var thisObjectPointer = this;
req.onload = function (e,thisObject=thisObjectPointer) {
var status = req.status; // HTTP response status, e.g., 200 for "200 OK"
var data = req.responseText; // Returned data
if(data.includes("200 OK")){
console.log("Checking LOGON STATE METHOD#2: ");
thisObject.props.refreshLogonStateInMainBand(login);
} else {
// inform user about wrong credentials
}
}
}
И тогда, когда я выполняю проверку, если я уже вошел в один адрес / checkLogon, я использую:
checkLogonState(currentUserName) {
console.log("CheckLogonState CALLED!");
var url = "http://localhost:8080/mvc1/checkLogon";
var method = "GET";
var req = new XMLHttpRequest();
var loginData;
req.overrideMimeType("application/json");
req.open('GET', url, true);
req.onload = function() {
}
req.send();
req.onreadystatechange=(e)=>{
if(req.readyState === 4 && req.responseText.length>0) {
if(req.responseText.includes("200 OK")){
console.log("Authenticated!!!");
this.changeMainComponentStateToLogin();
this.currentUserName = currentUserName;
this.oneTimeLogonCheckAction=false;
} else {
console.log("Not logged in!!!")
this.changeMainComponentStateToIdle();
this.currentUserName=undefined;
this.oneTimeLogonCheckAction=true;
}
this.forceUpdate();
}
}
}
Как вы можете ожидать, responseTest включает в себя 404 Unauthorized not 200 OK.
Я попробовал этов InternetExplorer, Microsoft Edge и Chrome.Ни один из них не использует сеанс повторно.
После того, как каждый из моих запросов консоль на стороне сервера показывает, что запросы отправляются из других сеансов - каждый запрос в новом сеансе.Я хотел бы узнать, как я могу использовать один и тот же сеанс, если я использую одно и то же окно браузера через много запросов.