Как сохранить HttpSession через вызовы перекрестного происхождения в Java Spring Rest?

У меня есть api весеннего отдыха, работающий на localhost:8080/api, и приложение для реагирования, использующее этот api на localhost:3000, и я пытаюсь сохранить информацию на случай, если пользователь обновит страницу.

Он отлично работает, если мой код внешнего интерфейса находится в самом приложении Spring, но не когда он работает на другом порту.

Вся онлайн-справка указывает на весеннюю безопасность (или не работает для меня), разве нет возможности сделать это без весенней безопасности?

Вот соответствующий код.

Бэкэнд
src/com/config/InitConfig.java

@Configuration
@EnableWebMvc
@ComponentScan("com")
public class InitConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

src/com/config/Initializer.java

public class Initializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return new Class[] {InitConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        // TODO Auto-generated method stub
        System.out.println("inside the initializer");
        return new String[] { "/" };
    }

}

src/com/controller/UserController.java

@RestController
@CrossOrigin
public class UserController {

    @Autowired
    UserService userService ;

    @RequestMapping(value = "/users",method=RequestMethod.GET)
    public ResponseEntity<ArrayList<User>> getAllUsers(HttpServletRequest req) {
        System.out.println("Inside users controller ") ;
        System.out.println(req.getSession().getId()) ;
        ArrayList<User> arr = new ArrayList<User>() ;
        for(int i = 0 ; i < 10 ; ++i) {
            arr.add(new User("sarvagya" , 1)) ;
        }
        return new ResponseEntity<ArrayList<User>>(arr , HttpStatus.OK) ;
    }

    @RequestMapping(value = "/" , method=RequestMethod.GET)
    public ResponseEntity<User> getCurrent(HttpServletRequest req) {
        System.out.println("Inside home controller ") ;
        System.out.println(req.getSession().getId()) ;
        System.out.println("CurrentUser is " + req.getSession().getAttribute("currentUser")) ;
        User user = (User) req.getSession().getAttribute("currentUser") ;
        if (user == null) return new ResponseEntity<User>(user, HttpStatus.OK) ; 
        return new ResponseEntity<User>(user , HttpStatus.OK) ;
    }


    @RequestMapping(value = "/users/current" , method=RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<User> getCurrentUser(HttpServletRequest req) {
        System.out.println(req.getSession().getId()) ;
        System.out.println("CurrentUser is " + req.getSession().getAttribute("currentUser")) ;
        User user = (User) req.getSession().getAttribute("currentUser") ;
        if (user == null) return new ResponseEntity<User>(user, HttpStatus.NOT_FOUND) ; 
        return new ResponseEntity<User>(user , HttpStatus.OK) ;
    }

    @RequestMapping(value = "users/login" , method=RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<User> getUserByEmail(@RequestBody User user , HttpServletRequest req) {
        System.out.println("Inside java controller " + user) ;
        User newUser = userService.findByEmail(user.getEmail()) ;
        System.out.println(newUser) ;
        if (newUser == null || !newUser.getPassword().equals(user.getPassword())) {
            newUser = null ;
            return new ResponseEntity<User>(newUser, HttpStatus.NOT_FOUND) ;
        }
        System.out.println("Successful login") ;
        // successful login
        req.getSession().setAttribute("currentUser", newUser) ;
        System.out.println(req.getSession().getId());
        return new ResponseEntity<User>(newUser, HttpStatus.OK) ;
    }
}

Внешний интерфейс

UserService.js

export const userService = {
    login : (user) => {
        const requestOptions = {
            method : 'POST' , 
            body : JSON.stringify(user) , 
            headers : {
                "Content-Type" : "application/json"
            } , 
            credentials : 'include'
        }
        return fetch(`${BASE_API_URL}/users/login`,requestOptions).then(response => {
            // valid credentials
            if (response.ok) {
                return response.json() ;
            } else {
                return Promise.reject(response.statusText) ;
            }
        }).then(data => {return data}) ;
    } , 
    logout : () => {} , 
    getUser : () => {
        return fetch(`${BASE_API_URL}/users/current` , {method : 'GET' , headers : {"Content-Type" : "application/json"}}).then(response => {
            if (response.ok) {
                return response.json()
            } else {
                return Promise.reject(response.statusText) ;
            }
        }).then(data => {return data}) ;
    } 
}

Я просто пытаюсь установить атрибут currentUser в объекте HttpSession при успешном входе в систему и получать эту информацию между обновлениями страницы. Я могу войти в систему, поэтому перекрестное происхождение работает, я думаю, единственная проблема в том, что мой идентификатор сеанса отличается при каждом запросе, который я делаю, поэтому информация теряется при обновлении страницы. Моя настройка неверна или это не способ работы с сеансами с запросами на перекрестное происхождение?

0
0
624
1

Ответы 1

Вместо того, чтобы использовать объект Session, лучше всего использовать систему аутентификации на основе токенов, в которой JWT или аналогичные зашифрованные токены вы можете временно сохранить в локальном хранилище вашего браузера и уничтожить его при выходе из системы / тайм-ауте.

перейдите по следующей ссылке для получения основной идеи jasonwatmore.com/post/2017/12/07/…

Jonathon 12.09.2018 08:42

Я знаю об этом. У меня уже запущен проект spring + angular, и я создаю интерфейс реагирования для использования api (но он работает на отдельном порте), поэтому на самом деле не хочу касаться бэкэнда, кроме конфигурации с перекрестным происхождением. Мой вопрос только в том, можно ли это сделать с объектом сеанса или нет.

Sarvagya 12.09.2018 09:14

Другие вопросы по теме