Доброе утро,
Из того, что я прочитал об ошибках CORS, добавление соответствующей аннотации к вашему контроллеру должно устранить эту ошибку. Эта ошибка не возникает с первыми тремя или последними @GetMapping
s. Похоже, эта проблема возникает только в почтовом запросе. Мне гораздо удобнее работать с Java
и Spring
, чем с React
и JavaScript
, поэтому я предполагаю, что моя ошибка возникает из-за внешнего кода. Это также может быть проблема с настройками браузера, поскольку вчера я получал ту же ошибку, когда пытался использовать https://jsonplaceholder.typicode.com/posts. Я в растерянности и был бы очень признателен за любую предоставленную помощь.
Я изменил "origin" в моей аннотации @CrossOrigin после нескольких неудач, чтобы проверить, неправильно ли я ее форматировал. Моя серверная часть также хорошо работает с Advanced REST Client
, что еще больше наводит меня на мысль, что моя проблема полностью связана с внешним интерфейсом или с тем, как я настроил Chrome
.
Вот точный текст ошибки : "Доступ к XMLHttpRequest по адресу 'http://localhost: 8080 / get_jeff / store_interval ' from origin 'http://localhost: 3000 ' заблокирован политикой CORS: Нет 'Access-Control -Allow-Origin 'присутствует на запрошенном ресурсе. "
Вот мой контроллер:
package getJeff.controllers;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.RedirectView;
import getJeff.entities.Name;
import getJeff.entities.Passerby;
import getJeff.services.ActivityService;
import getJeff.services.NameService;
import getJeff.services.PasserbyService;
import getJeff.utils.JSIntervalStorer;
import getJeff.utils.PasserbyGenerator;
import getJeff.utils.PasserbyQuerier;
@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
@RequestMapping("/get_jeff")
public class JeffGameController {
@Autowired
PasserbyService pasRepo;
@Autowired
NameService namRepo;
@Autowired
ActivityService actRepo;
Thread generate;
PasserbyGenerator pasGenerator;
PasserbyQuerier pasQuery;
JSIntervalStorer storer;
List<Passerby> passers;
@GetMapping
public RedirectView jeffGetting() {
pasGenerator = new PasserbyGenerator(pasRepo, namRepo, actRepo);
pasQuery = new PasserbyQuerier(pasRepo);
generate = new Thread(pasGenerator);
passers = new ArrayList<>();
generate.start();
return new RedirectView("/get_jeff/initial_jeffs");
}
@GetMapping("/initial_jeffs")
public List<Passerby> startGettingJeff() {
passers = pasQuery.initialQuery();
return passers;
}
@GetMapping("/more_jeffs")
public List<Passerby> keepGettingJeff() {
passers = pasQuery.subsequentQuery();
return passers;
}
@PostMapping(path = "/store_interval", consumes = MediaType.TEXT_PLAIN_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public String postInterval(@RequestBody String interval) {
storer = new JSIntervalStorer(interval);
return "";
}
@GetMapping(path = "/get_interval")
@ResponseStatus(HttpStatus.FOUND)
public long getInterval() {
return storer.getInterval();
}
@SuppressWarnings("deprecation")
@GetMapping("/stop_jeff")
public String stop(Model model) {
generate.stop();
pasRepo.deleteAll();
return "";
}
}
А вот мой компонент-контейнер (он находится в стадии тестирования, так что код довольно грубый):
import React, { Component, lazy, Suspense } from 'react';
const Passersby = lazy(() => import('../components/Passersby'));
const IntervalStored = lazy(() => import('../utils/IntervalStorer'));
class Public extends Component {
state = {
passersby: null
};
startJeff = () => {
this.setState({ passersby: null });
import('axios').then(axios => {
axios.get('http://localhost:8080/get_jeff')
});
setTimeout(this.stopIt, 10000);
this.setState({intervalStorer: IntervalStored});
//remember to call clearTimeout() if defeat conditions are satisfied
this.checkForJeff();
}
checkForJeff = () => {
if (this.state.passersby === null) {
this.setState({ passersby: [] });
}
this.queryForJeff();
}
queryForJeff = () => {
//set query Interval
}
assignJeff = () => {
import('axios').then(axios => {
axios.get('http://localhost:8080/get_jeff/more_jeffs')
.then(response => {
const folks = response.data;
const updatePassersby = this.state.passersby;
updatePassersby.push.apply(updatePassersby, folks);
this.setState({ passersby: updatePassersby });
});
});
}
//this method in particular is the one being tested
//It is very, very incomplete and the code below is just to test functionality
postInterval = () => {
import('axios').then(axios => {
const theInterval = setInterval(console.log('interval run'), 1000);
console.log(theInterval);
axios.post('http://localhost:8080/get_jeff/store_interval', theInterval);
})
}
stopIt = () => {
import('axios').then(axios => {
axios.get('http://localhost:8080/get_jeff/stop_jeff')
});
}
render() {
let people = null;
if (this.state.passersby) {
people = (
<Passersby
name={this.state.passersby.name}
activity={this.state.passersby.activity}
key={this.state.passersby.id}
passersby={this.state.passersby}
/>
)
}
return <div>
<h1>Jeffs?</h1>
<button onClick={this.startJeff}>Start the Jeffing</button>
<button onClick={this.checkForJeff}>More Possible Jeffs?</button>
<button onClick={this.postInterval}>Interval Test</button>
<button onClick={this.stopIt}>NO MORE JEFFS</button>
<Suspense fallback={<div>Jeff Could Be Anywhere...</div>}>
{people}
</Suspense>
</div>
}
}
export default Public;
Я также попытался изменить заголовок своего запроса следующим образом:
//the same method from above after the changes
postInterval = () => {
let config = {
headers: {
header1: "access!"
}
}
import('axios').then(axios => {
const theInterval = setInterval(console.log('interval run'), 1000);
console.log(theInterval);
const intervalNum = theInterval.valueOf();
axios.post('http://localhost:8080/get_jeff/store_interval', intervalNum, config);
})
}
Я также изменил свою аннотацию @CrossOrigin следующим образом:
@CrossOrigin(origins = "*", allowedHeaders = "access!")
Эти изменения не помогли. Если для понимания и решения проблемы требуется какая-либо другая информация, пожалуйста, дайте мне знать. Проблема исчезнет, если я использую плагин Access-Control-Allow-Origin, но я бы предпочел реальное решение. Спасибо за любую помощь.