2016-06-21 107 views
3

我完全難住。我對AngularJS非常陌生,我試圖給我的球衣服務器api打個電話,但我沒有運氣。它使用curl或Advanced Rest客戶端(Chrome瀏覽器插件)。然而,當我嘗試用我的angularjs應用程序打我的休息時,我收到以下內容:跨域請求被阻止,angularjs休息呼叫球衣api

「跨源請求被阻止:同源策略不允許讀取遠程資源http://localhost:8080/JerseyDemos/rest/employees(原因:CORS頭'訪問控制 - 允許 - 來源'丟失)。「

客戶:我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"); 
} 

}

應用類註冊我的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

這是誰是剛剛開始接觸網絡的人一個非常常見的錯誤服務,解決問題真的很簡單,但s有時開發人員花費數小時努力尋找解決方案。它發生在創建Web服務並嘗試從其他應用程序訪問它時發生,因爲您沒有啓用跨源資源共享(CORS),這意味着加載到一個域中的應用程序無法與來自不同域的資源。你所要做的就是啓用CORS。

如何激活它將取決於您的場景,在本教程中,我將演示如何爲在Glassfish上運行的Java EE應用程序啓用CORS,我假設您有一個類似於EJB REST的Web服務這一個,當其他應用程序嘗試使用它時,你會在你的螢火蟲控制檯上看到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..