问题由来:
总结一下自己学习过程中遇到的问题,在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)接收相应端口的请求,这里的*是通配符,由于是自己做的项目所以没有考虑安全问题,建议都设置成请求地址的端口号来一一匹配。