У меня весенний отдых 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) ;
}
}
Frontend
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 при успешном входе в систему и получать эту информацию между обновлениями страницы. Я могу войти в систему, так что перекрестное происхождение работает, я думаю, единственная проблема в том, что мой идентификатор сеанса отличается при каждом запросе, который я делаю, поэтому информация теряется при обновлении страницы. Моя установка неверна или это не тот способ работы с сеансами с запросами разных источников?