Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将跨源资源共享与SpringMVC4.0.0RESTfulWebService集成_Java_Angularjs_Rest_Spring Mvc_Cors - Fatal编程技术网

Java 如何将跨源资源共享与SpringMVC4.0.0RESTfulWebService集成

Java 如何将跨源资源共享与SpringMVC4.0.0RESTfulWebService集成,java,angularjs,rest,spring-mvc,cors,Java,Angularjs,Rest,Spring Mvc,Cors,我有一个返回JSON数据的简单Web服务 用户类com.bargadss.SpringService.Domain是包含 用户名、姓氏、姓氏、电子邮件 UserService类com.bargadss.SpringService.DAO有两个主要操作 getAllUser->查询数据库以从用户表中选择所有用户,并返回列表{User} getUserByidit user_ID->查询数据库以根据ID选择特定用户 SpringServiceController com.bargadss.Sprin

我有一个返回JSON数据的简单Web服务

用户类com.bargadss.SpringService.Domain是包含

用户名、姓氏、姓氏、电子邮件

UserService类com.bargadss.SpringService.DAO有两个主要操作

getAllUser->查询数据库以从用户表中选择所有用户,并返回列表{User} getUserByidit user_ID->查询数据库以根据ID选择特定用户 SpringServiceController com.bargadss.SpringService.Controller如下所示:

package com.bargadss.SpringService.Controller;

import java.util.List;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.bargadss.SpringService.DAO.UserService;
import com.bargadss.SpringService.Domain.User;


@RestController
@RequestMapping("/service/user/")
public class SpringServiceController {
 UserService userService=new UserService();

 @RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
 public User getUser(@PathVariable int id) {        
  User user=userService.getUserById(id);
  return user;
 }

 @RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
 public List<User> getAllUsers() {   
  List<User> users=userService.getAllUsers();
  return users;
 }
}
package com.bargadss.SpringService.Controller;

import java.util.LinkedHashMap;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;

import com.bargadss.SpringService.Domain.User;


@Controller
public class ListUserController {

@RequestMapping("/listUsers")
public ModelAndView listUsers() { 
    RestTemplate restTemplate = new RestTemplate();
    String url="http://localhost:8080/SpringServiceWithRESTAndJSONExample/service/user/";    
    List<LinkedHashMap> users=restTemplate.getForObject(url, List.class);
    return new ModelAndView("listUsers", "users", users);
}

@RequestMapping("/dispUser/{userid}")
public ModelAndView dispUser(@PathVariable("userid") int userid) { 
    RestTemplate restTemplate = new RestTemplate();
    String url="http://localhost:8080/SpringServiceWithRESTAndJSONExample/service/user/{userid}";
    User user=restTemplate.getForObject(url, User.class,userid);
    return new ModelAndView("dispUser", "user", user);
 }

}
package com.bargadss.CORS;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;


public class CorsFilter extends OncePerRequestFilter{

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
    if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
        // CORS "pre-flight" request
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Access-Control-Max-Age", "1800");//30 min
    }
    filterChain.doFilter(request, response);
}

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     id="WebApp_ID" version="3.0">
<display-name>SpringServiceWithRESTAndJSONExample</display-name>

<servlet>
   <servlet-name>rest</servlet-name>
  <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>rest</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
 <servlet-name>jsp</servlet-name>
 <url-pattern>/WEB-INF/jsp/*</url-pattern>
</servlet-mapping>

<filter>
  <filter-name>cors</filter-name>
  <filter-class>com.bargadss.CORS.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>cors</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>
web.xml文件如下所示:

package com.bargadss.SpringService.Controller;

import java.util.List;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.bargadss.SpringService.DAO.UserService;
import com.bargadss.SpringService.Domain.User;


@RestController
@RequestMapping("/service/user/")
public class SpringServiceController {
 UserService userService=new UserService();

 @RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
 public User getUser(@PathVariable int id) {        
  User user=userService.getUserById(id);
  return user;
 }

 @RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
 public List<User> getAllUsers() {   
  List<User> users=userService.getAllUsers();
  return users;
 }
}
package com.bargadss.SpringService.Controller;

import java.util.LinkedHashMap;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;

import com.bargadss.SpringService.Domain.User;


@Controller
public class ListUserController {

@RequestMapping("/listUsers")
public ModelAndView listUsers() { 
    RestTemplate restTemplate = new RestTemplate();
    String url="http://localhost:8080/SpringServiceWithRESTAndJSONExample/service/user/";    
    List<LinkedHashMap> users=restTemplate.getForObject(url, List.class);
    return new ModelAndView("listUsers", "users", users);
}

@RequestMapping("/dispUser/{userid}")
public ModelAndView dispUser(@PathVariable("userid") int userid) { 
    RestTemplate restTemplate = new RestTemplate();
    String url="http://localhost:8080/SpringServiceWithRESTAndJSONExample/service/user/{userid}";
    User user=restTemplate.getForObject(url, User.class,userid);
    return new ModelAndView("dispUser", "user", user);
 }

}
package com.bargadss.CORS;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;


public class CorsFilter extends OncePerRequestFilter{

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
    if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
        // CORS "pre-flight" request
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Access-Control-Max-Age", "1800");//30 min
    }
    filterChain.doFilter(request, response);
}

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     id="WebApp_ID" version="3.0">
<display-name>SpringServiceWithRESTAndJSONExample</display-name>

<servlet>
   <servlet-name>rest</servlet-name>
  <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>rest</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
 <servlet-name>jsp</servlet-name>
 <url-pattern>/WEB-INF/jsp/*</url-pattern>
</servlet-mapping>

<filter>
  <filter-name>cors</filter-name>
  <filter-class>com.bargadss.CORS.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>cors</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>
当AngularJS从另一个Web服务器调用Web服务时,返回一个涉及跨源资源共享问题的错误

为了消除错误,必须在控制器端执行哪些更改

AngularJS侧是否需要进行任何更改以避免这种情况?

检查

下载cors-filter-2.1.2.jar和java-property-utils-1.9.1.jar

mvn依赖关系

<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
  <groupId>com.thetransactioncompany</groupId>
  <artifactId>java-property-utils</artifactId>
  <version>1.9.1</version>
</dependency>

您错过了将Access Control Allow Origin头添加到servlet响应的拦截器。Cf:@alain.janinm上述链接非常有用,谢谢,但你能解释一下给定的问题吗?你确定请求来自子域吗?你所做的CORS过滤器允许你的servlet处理传入的请求,它实际上会在返回给浏览器的响应中添加一个标题,告诉我们请求将实际进行,但你也必须在其中添加一个标题Servlet响应在请求继续后返回给客户,这是通过拦截器完成的。