2016-06-21 12 views
3

私は完全に困惑しています。私はAngularJSにとって非常に新しく、私はジャージーサーバーapiに電話をかけようとしていますが、運がないのです。これはcurlまたはAdvanced Restクライアント(Chromeブラウザアドオン)を使用して動作します。しかし、私は自分のanglejsアプリを使って休憩しようとしたときに次のことを受けました..クロスオリジンリクエストがブロックされました。ジャージーAPIのangleJs rest call

"クロスオリジン要求がブロックされました:同じオリジンポリシーでリモートリソースを読み取ることができませんhttp://localhost:8080/JerseyDemos/rest/employees(理由:CORSヘッダー 'Access-Control- Allow-Origin 'があ​​りません)。 "

CLIENT:私のangularjsコードのスニペット

$scope.login = function() { 

This lets me connect to my server on a different domain 
    $http.defaults.headers.common['Authorization'] = 'Basic ' + Base64.encode('username' + ':' + 'password'); 

    $http({method: 'GET', url: 'http://localhost:8080/JerseyDemos/rest/employees'}). 
    success(function(data) { 
    console.log(data) 
    }). 

SERVER:私はジャージのフレームワークを使用しています

相続人は私のCORSフィルタ...

import java.io.IOException; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 

public class CorsResponseFilter implements ContainerResponseFilter { 

@Override 
public void filter(ContainerRequestContext request, 
        ContainerResponseContext response) throws IOException { 
    response.getHeaders().add("Access-Control-Allow-Origin", "*"); 
    response.getHeaders().add("Access-Control-Allow-Headers", 
      "origin, content-type, accept, authorization"); 
    response.getHeaders().add("Access-Control-Allow-Credentials", "true"); 
    response.getHeaders().add("Access-Control-Allow-Methods", 
      "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
} 

}

ApplicationクラスCORSフィルターを登録する

import com.howtodoinjava.jersey.provider.CorsResponseFilter; 
import org.glassfish.jersey.filter.LoggingFilter; 
import org.glassfish.jersey.server.ResourceConfig; 
import com.howtodoinjava.jersey.provider.AuthenticationFilter; 
import com.howtodoinjava.jersey.provider.GsonMessageBodyHandler; 
public class CustomApplication extends ResourceConfig { 
public CustomApplication() 
{ 
    packages("com.howtodoinjava.jersey"); 
    register(CorsResponseFilter.class); 
    register(LoggingFilter.class); 
    register(GsonMessageBodyHandler.class); 
    register(AuthenticationFilter.class); 
} 

}

のWeb.xml

<display-name>Archetype Created Web Application</display-name> 

<servlet> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.howtodoinjava.jersey.CustomApplication</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

従業員の休憩これは単なるウェブを使い始めるされている人々のための非常に一般的なエラーです

@Provider 
@Path("/employees") 
public class JerseyService { 
@Path("/all") 
@RolesAllowed("ADMIN") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response getAllEmployees() 
{ 
    Employees list = new Employees(); 
    list.setEmployeeList(new ArrayList<Employee>()); 

    list.getEmployeeList().add(new Employee(1, "Lokesh Gupta")); 
    list.getEmployeeList().add(new Employee(2, "Alex Kolenchiskey")); 
    list.getEmployeeList().add(new Employee(3, "David Kameron")); 

    return Response.status(200).entity(list).header("Access-Control-Allow-Origin", "GET, POST, PUT, DELETE, OPTIONS, HEAD").build(); 
} 

答えて

2

スニペットサービスは、本当に簡単に解決できますが、開発者は時間をかけて解決策を見つけるのに苦労しています。 Webサービスを作成して別のアプリケーションからアクセスしようとすると、クロスドメインリソース共有(CORS)が有効になっていないため動作しません。つまり、あるドメインにロードされたアプリケーションは別のドメインのリソースCORSを有効にするだけです。

このチュートリアルでは、シナリオに応じてどのようにアクティブにできるかについて、Glassfishで実行されているJava EEアプリケーションに対してCORSを有効にする方法を示します。EJB RESTful Webサービスがあると仮定していますこの場合、他のアプリケーションがFirebugコンソール上でCross-Origin Request Blockedエラーを表示すると、この場合、アプリケーションにフィルタを作成し、このクラスとまったく同じクラスを作成するだけです

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletResponse; 

public class CORSFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
      FilterChain filterChain) throws IOException, ServletException { 
     final HttpServletResponse response = (HttpServletResponse) servletResponse; 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Credentials", "true"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, HEAD, OPTIONS"); 
     response.setHeader("Access-Control-Allow-Headers", "Origin, Accept, x-auth-token, " 
       + "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { 

    } 

} 

は今、あなたは、あなたのweb.xmlにフィルタを登録し、次のコードをコピーして、実際のパッケージ名に「yourPackage」を交換する必要がある:

プロジェクトに
<filter> 
    <filter-name>cors</filter-name> 
    <filter-class>yourPackage.CORSFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>cors</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

これだけです!これで、アプリケーションはそのリソースを他のドメインと共有することができます。

Other Cross-Origin Request fix..

関連する問題