首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨域请求被阻止,angularjs rest调用jersey api

跨域请求被阻止,angularjs rest调用jersey api
EN

Stack Overflow用户
提问于 2016-06-22 07:42:12
回答 1查看 2.3K关注 0票数 3

我完全被难住了。我对AngularJS非常陌生,我正在尝试对我的jersey服务器应用编程接口进行rest调用,但我没有运气。它使用curl或高级Rest客户端(Chrome浏览器附加组件)工作。然而,当我尝试使用我的angularjs应用程序点击我的rest时,我收到了以下内容。

“跨域请求被阻止:同源策略不允许读取http://localhost:8080/JerseyDemos/rest/employees处的远程资源。(原因: CORS标头'Access-Control-Allow- Origin‘丢失)。”

客户端:我的angularjs代码片段

代码语言:javascript
复制
  $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)
  }).

服务器:我正在使用jersey框架

这是我的CORS过滤器。

代码语言:javascript
复制
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筛选器的应用程序类

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>

员工休息片段

代码语言:javascript
复制
@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();
}
EN

回答 1

Stack Overflow用户

发布于 2016-06-22 13:30:35

对于刚刚开始使用Web服务的人来说,这是一个非常常见的错误,解决起来非常简单,但有时开发人员会花费数小时来努力寻找解决方案。当您创建web服务并尝试从不同的应用程序访问它时,它将无法工作,因为您没有启用跨域资源共享(CORS),这意味着加载到一个域中的应用程序无法与来自不同域的资源进行交互。您所要做的就是启用CORS。

如何激活它取决于您的场景,在本教程中,我将展示如何为运行在Glassfish上的Java应用程序启用CORS,我假设您有一个与此类似的EJB服务,当其他应用程序尝试使用它时,您会在firebug控制台上看到跨域请求阻止错误,在这种情况下,您所要做的就是在您的应用程序中创建一个筛选器,只需在您的项目中创建一个与以下类完全相同的类:

代码语言:javascript
复制
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”替换为实际的包名:

代码语言:javascript
复制
<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..

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37956309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档