前端服务请求后台接口,返回跨域报错问题解决

解决此类问题的方法很多,有需要客户端和服务端都要更改的,例如jsonp,iframe等等;有只需要客户端更改的,这种情况只能出现在hybrid app开发中,即通过调用native方法来进行网络请求;有只需要服务端配置的,下面介绍3种服务端配置的方法。

第一种

如果您使用的mvc框架是spring4.2以上的话,一个@CrossOrigin就可以搞定。将@CrossOrigin加到Controller上,那么这个Controller所有的请求都是支持跨域的,代码如下:

@Controller
@CrossOrigin
public class GreetingController {

将@CrossOrigin加到请求方法上,那么这个请求是支持跨域的,代码如下

@CrossOrigin
    @RequestMapping("/greeting")
    public @ResponseBody Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) {

更详细的@CrossOrigin介绍,请参看这里

第二种

全局配置,也需要spring4.2以上。

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
            }
        };
    }

.addCorsMappings()中的参数代表支持跨域的url,.allowedOrigins()中的参数代表可以访问该接口的域名,设置为”*”可支持所有域。

第三种

这种方法就跟框架无关了,需要两个jar包,点击这里进行下载,两个jar包可以放的程序里,也可以放到tomcat中,然后将下面的配置写到web.xml中就可以了

< filter >
    < filter-name > CORS </ filter-name >
    < filter-class > com.thetransactioncompany.cors.CORSFilter </ filter-class >   
    < init-param >   
        < param-name > cors.allowOrigin </ param-name >   <!--配置授信的白名单的域名!-->
        < param-value > * </ param-value >   
    </ init-param >   
    < init-param >   
        < param-name > cors.supportedMethods </ param-name >   
        < param-value > GET, POST, HEAD, PUT, DELETE </ param-value >   
    </ init-param >   
    < init-param >   
        < param-name > cors.supportedHeaders </ param-name >   
        < param-value > Accept, Origin, X-Requested-With, Content-Type, Last-Modified </ param-value >   
    </ init-param >   
    < init-param >   
        < param-name > cors.exposedHeaders </ param-name >   
        < param-value > Set-Cookie </ param-value >   
    </ init-param >   
    < init-param >   
        < param-name > cors.supportsCredentials </ param-name >   
        < param-value > true </ param-value >   
     </ init-param >   
</ filter >   
< filter-mapping >   
    < filter-name > CORS </ filter-name >   
    < url-pattern > /* </ url-pattern >   
</ filter-mapping > 

 

我采用了第一种方法,前端调服务是预解析可以了,但是调用服务的时候还是报跨域的错误,解决方案如下:

情形一:在方法上使用@CrossOrigin注解,但@RequestMapping注解中没有指定Get、Post方式,通过method = RequestMethod.POST/GET指定后,问题解决。

情形二:跨域访问响应状态码是405-Method Not Allowed,请求行中指定的请求方法不能被用于请求相应的资源。原因很明显,就是请求不正确,检查代码,使用正确的方式请求。

情形三:查看springboot版本,如果是2.0以后版本,allowCredentials属性的默认值为false,返回的响应头AccessControlAllowCredentials属性值也为false,如果客户端携带cookie的请求这时是不能跨域访问的,所以需要手动在注解中设置allowCredentials为true
@CrossOrigin(allowCredentials = “true”)

 

参考文章:https://www.cnblogs.com/zrui-xyu/p/8981442.html

参考文章:https://blog.csdn.net/qq_39387856/article/details/96877535

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值