后端跨域问题的解决方式

如果是springboot应用:增加一个全局配置就可以了

package org.nf.config.system;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Description 跨域配置
 * @Date 2019/1/27 13:31
 **/
@Configuration
public class CORSConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedHeaders("*")
                        .allowedMethods("*")
                        .allowedOrigins("*");
            }
        };
    }
}
跨域指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript 施加的安全限制。(浏览器也不是对于从所有网站请求来的脚本都会执行,只有同源的脚本才会执行)
协议、域名、端口号都相同叫同源
协议、域名、端口号只要有一个不同,就叫非同源(跨域)
注意:http://localhost:8080/index.html 调用 http://127.0.0.1:8080/welcom.jsp 虽然localhost等同于 127.0.0.1 但是也是非同源的。 img、iframe、script 等标签的 src 属性是特例,它们是可以访问非同源网站的资源的。
对于非同源的会有如下情况:

1、Cookie、LocalStorage 和 IndexDB 无法读取

2、DOM 和 Js对象无法获得

3、AJAX 请求不能发送

解决方式如下:
nginx 转发,HttpClient 请求转发(服务器端使用HttpClient类对象向跨域的服务器请求数据,再转发给前端),JSONP 方式(----请求的是个脚本的地址------使用 JSONP模式来请求数据的时候服务端返回的是一段可执行的 JavaScript代码。因为jsonp 跨域的原理就是用的动态加载 script的src ,所以我们只能把参数通过 url的方式传递,所以jsonp的 type类型只能是get !【最终渲染在界面的是

//对于上面的JSONP 请求,其实jQuery会转化为
<script type="text/javascript" src="http://localhost:8080/JavaWeb01/getPassWord?userName=Tom&backFunction=jQuery3047_153227&_=15228">
   </script>

】),response 添加 header

//*表示支持所有网站访问,也可以额外配置相应网站
resp.setHeader("Access-Control-Allow-Origin", "*");

jsonp的

$.ajax({
            type:"get",
            async:false,
            url:"http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName=Tom",
            dataType:"jsonp",//数据类型为jsonp
            jsonp:"backFunction",//服务端用于接收callBack调用的function名的参数
            success:function (data) {
                alert(data["passWord"]);
            },
            error:function () {
                alert("error");
            }

        });

jsonp相应的后端代码

@WebServlet("/getPassWordByUserNameServlet")
public class UserServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String userName = req.getParameter("userName");
        String passWord = null;
        if(userName != null){
            passWord = "123";
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("passWord",passWord);
        //1、第一种方法:*表示支持所有网站访问,也可以额外配置相应网站
        //resp.setHeader("Access-Control-Allow-Origin", "*");

        //2、第二种方法:jsonp
        String backFunction = req.getParameter("backFunction");
        resp.getWriter().println(backFunction+"("+jsonObject.toJSONString()+")");
        
        //resp.getWriter().println(jsonObject.toJSONString());
    }
}

使用注解解决跨域问题

对于spring应用或者springboot应用,一般使用注解都是可以解决跨域问题
在这里插入图片描述
如果加了@CrossOrigin注解还是有跨域问题的话,就要考虑是否有缓存/前端是否请求有问题等了
参考:
如何解决跨域问题
https://www.cnblogs.com/ysocean/p/9380551.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值