不多说,直接上代码。
- 被调用方自适应调用方请求域
- 该方法只需要修改被调用方的后台代码,调用方可依照正常的ajax访问数据
- 无序列表我们以spring-boot框架为例子,首先,在后台创建一个跨域处理过滤器,代码如下
-
import org.springframework.util.StringUtils; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 跨域请求处理 */ public class CrosFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) servletResponse; HttpServletRequest request = (HttpServletRequest) servletRequest; String origin = request.getHeader("Origin"); if(!StringUtils.isEmpty(origin)){ //但请求带有cookie的时候,origin不能为*,必须是全匹配名 response.addHeader("Access-Control-Allow-Origin",origin); } response.addHeader("Access-Control-Allow-Methods","*"); String header = request.getHeader("Access-Control-Allow-Headers"); //匹配所有自定义请求头 if(!StringUtils.isEmpty(header)){ response.addHeader("Access-Control-Allow-Headers",header); } //代表着浏览器请求第一次之后,一个小时之内可以缓存请求信息,不需要在发送预检命令 response.addHeader("Access-Control-Max-Age","3600"); //当请求带cookie的时候,需要将Credentials设置为true response.addHeader("Access-Control-Allow-Credentials","true"); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
-
- 下一步是在启动类里面配置过滤器
-
import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import springfox.documentation.swagger2.annotations.EnableSwagger2; @SpringBootApplication @EnableSwagger2 @MapperScan("com.vcyber.mapper") public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } /** * 处理跨域 * @return */ @Bean public FilterRegistrationBean registrationBean(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.addUrlPatterns("/*"); bean.setFilter(new CrosFilter()); return bean; } }
-
- 到这里使用过滤器处理跨域请求的方法就完成了,这种方式适用于任务一种请求,实用性比Jsonp要好,推荐使用。
- spring框架处理跨域
- 上面我们讲的两种处理方式都是适用后台任何一种框架,而我们的spring框架提供了一种框架自带的解决方式。
- 就是在我们提供被请求的类或者方法上面添加一个@CrossOrigin注解,如:
-
@RestController @RequestMapping("loginrecord") @CrossOrigin public class LoginRecordController { }
或
-
@RestController @RequestMapping("loginrecord") public class LoginRecordController { @GetMapping("getMybatisLoginList") @CrossOrigin public ResponseData getMybatisLoginList(){ ResponseData responseData = new ResponseData(); responseData.setCode("200"); responseData.setMessage("成功"); responseData.putDataValue("list",loginRecordMapper.selectList(null)); return responseData; } }
-
- 在类上面加上@CrossOrigin注解,则表示该类里面的所有方法都支持跨域请求,如果在指定方法上加注解,则说明该方法支持跨域请求
- Jsonp
- 前台使用ajax的jsonp方式访问请求
-
$.ajax({ type:"get", url:"http://localhost:8080/loginrecord/getMybatisLoginList", dataType:"jsonp", jsonp:"callback", success:function(result){ alert(result) }
-
- 后台需要添加一个JsonP处理类
-
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; @ControllerAdvice public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { public JsonpAdvice(){ super("callback"); } }
-
- 注意:1.JsonpAdvice构造函数所返回的数据必须与前端ajax的jsonp属性数据一致
2.Jsonp只支持GET请求,所以面对多种请求方式的时候,不建议使用,可采用别种方式
- 前台使用ajax的jsonp方式访问请求