2017-02-22 26 views
0

Я написал API-интерфейс Jersey2 Java и доступен.Ошибка заголовка 'Access-Control-Allow-Origin'

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

import javax.ws.rs.*; 
import javax.ws.rs.core.*; 

@Path("/test") 
public class Connect { 

    //Vars 
    private Connection conn; 

    @GET 
    @Path("/test") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String hello(){ 
     return "helloWorld"; 
    } 

Когда я ударил это в моем Angular2 приложение, используя ниже код ...

constructor(HttpWebServiceService1: HttpWebServiceService1){ 
    HttpWebServiceService1.getHTTP() 
     .subscribe(
     resBody => this.title = resBody.title, 
     error => console.error('Error: ' + error), 
     () => console.log('Completed!') 

    ); 

С класса для HTTP ....

import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class HttpWebServiceService1 { 

     constructor(private http: Http) {} 
     getHTTP() { 
     return this.http.get('http://localhost:8080/MyApi/test/test').map(
      response => response.json()); 
    } 
} 

Я получаю сообщение об ошибке в браузерная консоль ...

XMLHttpRequest не может загрузить http://localhost:8080/MyApi/test/test. Нет заголовка «Access-Control-Allow-Origin» на запрашиваемом ресурсе .

Помощь!

Обновление: Я импортировал фильтр-фильтр-2.5-SNAPSHOT.jar. Я попытался ввести следующее в свой web.xml, но получил ошибку ... я близок. Я знаю, что есть способ сделать это в Java динамически ...

<!-- CORS Filter Begin --> 
<filter> 
     <filter-name>CORS</filter-name> 
     <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> 
     <init-param> 
     <param-name>cors.allowGenericHttpRequests</param-name> 
     <param-value>true</param-value> 
     </init-param> 
     <init-param> 
     <param-name>cors.allowOrigin</param-name> 
     <param-value>*</param-value> 
     </init-param> 
     <init-param> 
     <param-name>cors.allowSubdomains</param-name> 
     <param-value>true</param-value> 
     </init-param> 
     <init-param> 
     <param-name>cors.supportedMethods</param-name> 
     <param-value>GET, HEAD, POST, PUT, DELETE, OPTIONS</param-value> 
     </init-param> 
     <init-param> 
     <param-name>cors.supportedHeaders</param-name> 
     <param-value>origin, authorization, x-file-size, x-file-name, content-type, accept, x-file-type</param-value> 
     </init-param> 
     <init-param> 
     <param-name>cors.supportsCredentials</param-name> 
     <param-value>true</param-value> 
     </init-param> 
     <init-param> 
     <param-name>cors.maxAge</param-name> 
     <param-value>3600</param-value> 
     </init-param> 
    </filter> 
    <!-- CORS Filter End --> 
<!-- CORS Filter Mappings Begin --> 
    <filter-mapping> 
     <filter-name>CORS</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <!-- CORS Filter Mappings End --> 

ответ

2

Чтобы лучше понять ошибки пройти через этот подробный ответ о CORS

Самый простой способ, чтобы добавить заголовок в ответе :

return Response.ok().header("Access-Control-Allow-Origin", "*") 

См эту post, чтобы получить больше идеи.

0

при запуске приложения на localhost: some_port и запустите свой сервер на localhost :: other_port, чем вы получите ошибку с Access-Control-Allow-Origin.

вы можете исправить это, конвертировав ваш localhost (127 ....) в другой url файл Hosts. (C: \ Windows \ System32 \ drivers \ etc).

<YOUR LOCALHOST IP> some IP 

и не пытаться снова

+0

thx для вашего ответа, но вам нужно будет уточнить его ... изменить какой url на какой URL-адрес на какой файл и где? – Fearghal

0

использовать следующие CORSResponseFilter:

пакет io.buyr.api.filter;

import java.io.IOException; 

import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 
import javax.ws.rs.core.MultivaluedMap; 

public class CORSResponseFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) 
     throws IOException { 

     MultivaluedMap<String, Object> headers = responseContext.getHeaders(); 

     headers.add("Access-Control-Allow-Origin", "*"); 
     // mirror back headers - reason: http://stackoverflow.com/a/13147554/873282 
     headers.add("Access-Control-Allow-Headers", requestContext.getHeaderString("Access-Control-Request-Headers")); 
     headers.add("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,HEAD,OPTIONS"); 
    } 

} 


public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     ... 
     register(CORSResponseFilter.class); 
     ... 
    } 

} 
+0

Thx мельница для ответа. Можете ли вы понять, что я делаю выше немного дальше .... Я импортировал CORS lib ... но я не понимаю, как использовать ваш код ... где мое возвращаемое значение идет, например. – Fearghal