gpt4 book ai didi

angularjs - 跨源请求被阻止,AngularJS 对 jersey api 的剩余调用

转载 作者:行者123 更新时间:2023-12-02 22:41:04 25 4
gpt4 key购买 nike

我完全被难住了。我对 AngularJS 很陌生,我正在尝试对我的 Jersey 服务器 api 进行休息调用,但我没有运气。它使用curl或Advanced Rest客户端(Chrome浏览器插件)工作。然而,当我尝试使用我的 angularjs 应用程序休息时,我收到了以下信息。

“跨源请求被阻止:同源策略不允许读取 http://localhost:8080/JerseyDemos/rest/employees 处的远程资源。(原因:缺少 CORS header “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)
}).

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

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

最佳答案

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

如何激活它取决于您的场景,在本教程中,我将展示如何为在 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() {

}

}

现在您必须在 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..

关于angularjs - 跨源请求被阻止,AngularJS 对 jersey api 的剩余调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37956309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com