当前位置: 首页 > 知识库问答 >
问题:

跨源请求被阻止,angularjs对jersey api的rest调用

施茂
2023-03-14

我完全被难住了。我对AngularJS非常陌生,我正试图对我的泽西服务器api进行rest调用,但我运气不好。它使用curl或高级Rest客户端(Chrome浏览器加载项)工作。然而,当我试图使用我的angularjs应用程序打我的Rest时,我重复了以下内容…

  $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)
  }).

这是我的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);
}
<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();
}

共有1个答案

扶隐水
2023-03-14

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

如何激活它将取决于您的场景,在本教程中,我将展示如何为运行在Glassfish上的Java EE应用程序启用CORS,我假设您有一个类似于此的EJB RESTful web服务,当其他应用程序试图使用它时,您会在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>

就是这样!现在您的应用程序将允许其资源与其他域共享。

其他跨源请求修复..

 类似资料:
  • 我也在应用程序根目录中使用。htaccess文件。(waleedahmad.kd.io/node)。

  • 问题内容: 因此,我有了这个Go http处理程序,该处理程序将一些POST内容存储到数据存储中,并检索其他一些信息作为响应。在后端,我使用: 在我的firefox OS应用程序中,我使用: 传入的部分都一直如此。但是,我的回复被阻止了。给我以下信息: 我尝试了许多其他操作,但是无法从服务器获得响应。但是,当我将Go POST方法更改为GET并通过浏览器访问该页面时,我得到的数据太糟糕了。我无法真

  • 如何通过 ajax 从远程 url 获取内容? jQuery ajax请求被阻止,因为跨源 控制台日志 跨来源请求被阻止:同一来源策略不允许读取http://www.dailymotion.com/embed/video/x28j5hv.的远程资源(原因:CORS标头“Access-Control-Allow-Origin”缺失)。 已阻止跨源请求:同源策略不允许读取位于的远程资源http://w

  • 问题内容: 这是我的代码: 这适用于GET请求而不是POST! 我将Apache用作服务器,并使用以下命令对其进行了配置: 在我的angularjs中,我包含在模块应用程序的配置中: 但是请求POST仍然无法正常工作! 我希望有人能提出任何想法。 问题答案: 在服务器端添加这些标头: 如果仍然无法正常工作,请发布浏览器正在发送的预检请求的详细信息。 为什么要这样做? 如果不是简单的请求(例如,表单

  • 因此,当我试图使用React将数据发送到后端时,我遇到了这个错误。据我所知,我需要允许在后端和文件中进行通信。以下是我使用的一些链接: 无“访问控制允许源”-节点/Apache端口问题 访问控制允许起源头是如何工作的? 他们两个都有代码,但都没用。 到目前为止,我的服务器端代码如下: 这是我的客户端代码: 那么我错过了什么?我没有文件,但我都是在本地完成的,所以我不确定是否可以使用它。 在我看来,

  • 问题内容: 无法致电Spring REST服务 我的春季服务 我的AJAX代码 我收到以下错误:( 跨域请求被阻止:同源策略禁止读取位于http:// localhost:8080 / SpringMVC / rest / MAS / authenticate 的远程资源。可以通过将资源移到同一域或启用CORS来解决此问题。 我也尝试过。它将我的body对象附加到URL中,URL变为不同的URL,