2016-06-21 2 views
3

Я полностью в тупике. Я очень новичок в AngularJS, и я пытаюсь сделать вызов для отдыха на моем jersey-сервере api, но мне не повезло. Он работает с использованием curl или Advanced Rest client (дополнение браузера Chrome). Однако я получил следующее при попытке ударить по моему приложению с помощью моего приложения angularjs.Запрос на перекрестный запрос Заблокированный, угловой вызов для отдыха на джерси api

«Запрос на перекрестный запрос заблокирован: политика одного и того же происхождения запрещает чтение удаленного ресурса по адресу http://localhost:8080/JerseyDemos/rest/employees. (Причина: заголовок CORS 'Access-Control- Allow-Origin 'отсутствует. "

КЛИЕНТ: фрагмент моего 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: Я использую рамки Джерси

Heres мой 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 Услуги, это очень просто решить, но разработчики ometimes тратят часы, пытаясь найти решение. Это происходит, когда вы создаете веб-службу и пытаетесь получить к ней доступ из другого приложения, это не сработает, потому что у вас нет возможности совместного использования ресурсов Cross-Origin (CORS), что означает, что приложение, загруженное в один домен, не может взаимодействовать с ресурсов из другого домена. Все, что вам нужно сделать, это включить CORS.

Как вы можете активировать его в зависимости от вашего сценария, в этом уроке я расскажу, как включить CORS для приложения Java EE, работающего на Glassfish, я предполагаю, что у вас есть веб-сервис EJB RESTful, аналогичный этот, и когда другие приложения пытаются его уничтожить, вы видите ошибку блокировки запроса на перекрестный запрос на вашей консоли firebug, в этом случае все, что вам нужно сделать, это создать фильтр в вашем приложении, просто создайте класс точно так же, как этот на вашем проекте:

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..