Несколько заголовков CORS «Access-Control-Allow-Origin» не разрешены / отсутствует заголовок CORS «Access-Control-Allow-Origin») - PullRequest
0 голосов
/ 26 января 2019

У меня проблемы с заголовками CORS при отправке HTTP-запроса из моего приложения Angular 7 (размещенного на http://localhost:4200) в мое приложение Spring-Boot (размещенного на https://localhost:8924) из Firefox.

У меня в приложении Spring-Boot есть фильтр CORS, который добавлен к моему запросу:

@Component
public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response,
                                    final FilterChain filterChain) throws ServletException, IOException {
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH, HEAD");
        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Authorization, Content-Type");
        response.addIntHeader("Access-Control-Max-Age", 3600);

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) 
        {
            response.setStatus(HttpServletResponse.SC_OK);
        } 
        else 
        {
            filterChain.doFilter(request, response);
        }
    }
}
    @Override
    protected void configure(HttpSecurity http) throws Exception 
    {
        http.addFilterBefore(corsFilter(), SessionManagementFilter.class);
        http.csrf().disable().
            authorizeRequests()
                .antMatchers("/api/auth/**","/api/MentorCalendar","/api/user/role/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
    }

При отправке запроса консоль Firefox возвращает это сообщение об ошибке:

Запрос перекрестного источника заблокирован: та же политика происхождения запрещает чтение удаленного ресурса в http://localhost:8924/api/auth/signin. (причина: несколько заголовков CORS 'Access-Control-Allow-Origin' не разрешены).

Закомментирование Access-Control-Allow-Origin:

@Component
public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response,
                                    final FilterChain filterChain) throws ServletException, IOException {
//        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH, HEAD");
        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Authorization, Content-Type");
        response.addIntHeader("Access-Control-Max-Age", 3600);

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) 
        {
            response.setStatus(HttpServletResponse.SC_OK);
        } 
        else 
        {
            filterChain.doFilter(request, response);
        }
    }
}

Возвращает это сообщение об ошибке:

Запрос перекрестного источника заблокирован: та же политика происхождения запрещает чтение удаленного ресурса на http://localhost:8924/api/auth/signin. (причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»).

src / app / home / login.component.ts extract

export class LoginComponent {
  constructor(private LoginService: LoginService, private router: Router) {}

  login(inputUsername, inputPassword){
    this.LoginService.login({username: inputUsername, password: inputPassword})
        .subscribe(data => {
        localStorage.setItem("jwtToken", data.accessToken);

src /app / home / login.service.ts

const httpOptions = {
  headers: new HttpHeaders({
    'Content-Type':  'application/json'
  })
};

@Injectable()
export class LoginService {
  loginUrl = "http://localhost:8924/api/auth/signin";

  constructor( private http: HttpClient ) {}

  login(loginCreds: any): Observable<any> {
  return this.http.post<any>(this.loginUrl, loginCreds, httpOptions);
  }
}

Как это сделатьон response.addHeader («Access-Control-Allow-Origin», «*»);строка устанавливает несколько заголовков, когда они включены, но нет, когда я их удаляю?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Это решило проблему для меня:

if(!response.containsHeader("Access-Control-Allow-Origin"))
{
    response.addHeader("Access-Control-Allow-Origin", "*"); 
}

Не идеальный способ заставить его работать

0 голосов
/ 26 января 2019

Вы пытались включить @ CrossOrigin () в вашем контроллере прыгунной загрузки. Ниже приведен основной фрагмент.

@CrossOrigin(origins = "http://localhost:9000")
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) {
    System.out.println("==== in greeting ====");
    return new Greeting(counter.incrementAndGet(), String.format(template, name));
}

Для получения дополнительной информации посетите Включение CORS

У меня была такая же проблема. Это было решено вышеуказанным решением. У вас не должно быть проблем с CORS при использовании Internet Explorer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...