简体   繁体   English

Cross-Origin请求被阻止,angularjs休息调用jersey api

[英]Cross-Origin Request Blocked, angularjs rest call to jersey api

I'm completely stumped. 我完全难过了。 I am very new to AngularJS and I am trying to make a rest call to my jersey server api but I am having no luck. 我是AngularJS的新手,我正在尝试对我的球衣服务器api进行休息,但我没有运气。 It works using curl or Advanced Rest client (Chrome browser add-on). 它使用curl或Advanced Rest客户端(Chrome浏览器插件)。 However I recevied the following when attempting to hit my rest using my angularjs app.. 然而,当我尝试使用我的angularjs应用程序来休息时,我收到了以下内容。

"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/JerseyDemos/rest/employees . (Reason: CORS header 'Access-Control-Allow-Origin' missing)." “跨源请求已阻止: 同源策略禁止在http:// localhost:8080 / JerseyDemos / rest / employees中读取远程资源。(原因:缺少CORS标头'Access-Control-Allow-Origin')。”

CLIENT: snippet of my angularjs code 客户端:我的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: I am using jersey framework 服务器:我正在使用泽西框架

Heres my CORS Filter... 继承人我的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 class to register my CORS Filter 应用程序类注册我的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 在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>

Employee rest snippet 员工休息片段

@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();
}

This is a very common error for people who are just getting started with Web Services, it's really simple to solve but sometimes developers spend hours struggling to find a solution. 对于刚刚开始使用Web服务的人来说,这是一个非常常见的错误,它解决起来非常简单,但有时开发人员花费数小时努力寻找解决方案。 It happens when you create a web service and tries to access it from a different application, it won't work because you don't have Cross-Origin Resource Sharing (CORS) enabled, which means an application loaded in one domain cannot interact with resources from a different domain. 它发生在您创建Web服务并尝试从其他应用程序访问它时,它将无法工作,因为您没有启用跨源资源共享(CORS),这意味着在一个域中加载的应用程序无法与之交互来自不同域的资源。 All you have to do is to enable CORS. 您所要做的就是启用CORS。

How you can active it will depending on your scenario, in this tutorial I'm going to show how to enable CORS for a Java EE application running on Glassfish, I'm assuming you have an EJB RESTful web service similar to this one, and when other applications tries to consume it you see the Cross-Origin Request Blocked error on your firebug console, in this case all you have to do is to create a filter in your application, just create a class exactly like this one on your project: 如何激活它将取决于您的场景,在本教程中,我将展示如何为在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() {

    }

}

Now you have to register the filter in your web.xml, copy the following code and replace “yourPackage” with your actual package name: 现在,您必须在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>

That's it! 而已! Now your application will allow its resources to be shared with other domains. 现在,您的应用程序将允许其资源与其他域共享。

Other Cross-Origin Request fix.. 其他跨源请求修复..

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM