Используйте один и тот же HTTP-сеанс в JavaScript через много запросов - PullRequest
1 голос
/ 20 мая 2019

В моем бэкэнде я аутентифицирую пользователя один раз в журнале, а затем сохраняю аутентифицированные сессии на сервере.Затем после каждого запроса пользователя я проверяю, сохраняется ли сеанс, связанный с запросом, как аутентифицированный.Проблема в том, что когда я использую запросы 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.Ни один из них не использует сеанс повторно.

После того, как каждый из моих запросов консоль на стороне сервера показывает, что запросы отправляются из других сеансов - каждый запрос в новом сеансе.Я хотел бы узнать, как я могу использовать один и тот же сеанс, если я использую одно и то же окно браузера через много запросов.

1 Ответ

0 голосов
/ 20 мая 2019

Установка withCredentials на true для всех XMLHttpRequest,

  var req = new XMLHttpRequest();
  req.withCredentials = true;
  req.open("POST", url, true);
  req.setRequestHeader("Content-Type", "application/json");
  req.send(crendentialsObjectJSON);

поможет сохранить сеанс между вызовами.

На стороне сервера добавьте это ко всем вашим контроллерамчтобы решить проблемы с корсом,

@CrossOrigin(origins = ["http://localhost:3000"], allowCredentials = "true")
...