Springboot中解决Ajax请求跨域问题

问题由来:

总结一下自己学习过程中遇到的问题,在SpringMVC中ajax中的的url请求可以直接跳转到对应控制类的映射地址,而将相同的项目代码移植到SpringBoot中后却发现此功能失效了,一开始以为是代码出错自己反复检查了好久,后来经老师点拨发现是ajax所在的html页面的启动端口是63342:项目代码如下

<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
       function a(){
            var User = {
                userNo:$('#userNo').val(),
                userName:$('#userName').val(),
                password:$('#password').val()
            }
            var json = JSON.stringify(User);
           $.ajax({
               url:"http://localhost:8080/register",
               type:"post",
               contentType:'application/json',
               data:json,
               dataType:'text',
               success:function (data){
                  alert(data);
               }
           })
       }
    </script>
</head>
<body>
    <div>
        <p><span>请输入账号:</span><input type="text" name="userNo" id="userNo"></p>
        <p><span>请输入用户名:</span><input type="text" name="userName" id="userName"></p>
        <p><span>请输入密码:</span><input type="password" name="password" id="password"></p>
        <p><button onclick="a()">注册</button></p>
    </div>
</body>

html文件路径:/templates/register.html

控制类部分代码如下:

@Controller
@CrossOrigin(origins ="*",maxAge = 3600)
public class registerController {
    @ResponseBody
    @RequestMapping("/register")
    public String register(@RequestBody String json) throws IOException {
        String data;
        System.out.println("--------------------------------------------------");
        System.out.println(json);
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        int userNo = user.getUserNo();
        String userName = user.getUserName();
        String password = user.getPassword();
        System.out.println("--------------------------------------------------");

        if(userNo==10011&&"张三".equals(userName)&&"123456".equals(password)){
            data="注册成功,请登录";
           return data;
        }else{

                 data=   "注册失败";
                 return data;
        }
    }
}

问题分析:

在原本的SpringMVC项目中,ajax中url的值是"/register",它能指向控制类"/register"映射的原因是:SpringMVC框架的前端页面都是由Tomcat启动,走的是统一的8080端口,而在SpringBoot项目中,由于它是内嵌的Tomcat,因此控制类依旧走的8080端口,而自己编写的html页面却不经过Tomcat服务器,因此就造成了ajax请求跨域的问题。


解决方案:

此解决方案仅针对于当前的问题域:

在ajax请求中的url应指向控制类映射地址的具体路径,包括端口号

url:"http://localhost:8080/register"

在对应的控制类中添加注解

@CrossOrigin(origins ="*",maxAge = 3600)接收相应端口的请求,这里的*是通配符,由于是自己做的项目所以没有考虑安全问题,建议都设置成请求地址的端口号来一一匹配。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值