记录在 SpringBoot 中 @CrossOrigin 注解不生效问题

发布时间 2023-04-06 11:13:49作者: 劣技砖猿

昨天在项目前后端联调时遇到了跨域问题,于是就在 Controller 类上加上了 @CrossOrigin 注解。加上之后,除了 GET 请求之外,其他请求依然有跨域问题,特此记录一下,也避免大家踩坑。

这是我 Controller 类的代码:

@RestController
@RequestMapping("/admin/hospitalSet")
@CrossOrigin
public class HospitalSetController {
    @Autowired
    public HospitalSetService hospitalSetService;
	
    @RequestMapping(value = "/delete/{id}")
    public Result<Boolean> delete(@PathVariable("id")int id){
        if (hospitalSetService.removeById(id)){
            return Result.ok();
        }else {
            return Result.no("删除失败,请重试。");
        }
    }
	
    @RequestMapping("/getPage")
    public Result getPage(@RequestParam(defaultValue = "1")int index, @RequestParam(defaultValue = "10")int count,  HospitalSetQueryVo queryVo){
        Page<HospitalSet> page = new Page<>();
        page.setCurrent(index);
        page.setSize(count);
        QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
        if (queryVo.getHosname() !=null && queryVo.getHosname().length() > 0) {
            wrapper.like("hosname",queryVo.getHosname());
        }
        if (queryVo.getHoscode() != null && queryVo.getHoscode().length() > 0) {
            wrapper.eq("hoscode",queryVo.getHoscode());
        }
        Page<HospitalSet> page1 = hospitalSetService.page(page, wrapper);
        return Result.ok(page1);
    }
    @RequestMapping("/add")
    public Result add(HospitalSet hospital){
        hospital.setIsDeleted(0);
        hospital.setStatus(1);
        Random rd = new Random();
        hospital.setSignKey(MD5.encrypt(System.currentTimeMillis() + "" + rd.nextInt(1000)));
        boolean save = hospitalSetService.save(hospital);
        if (save){
            return Result.ok();
        }else {
            return Result.no("保存失败!");
        }
    }
    @RequestMapping("/update")
    public Result update(HospitalSet hospital){
        boolean b = hospitalSetService.updateById(hospital);
        if (b){
            return Result.ok();
        }else {
            return Result.no("修改失败!");
        }
    }
}

所有的方法全部都是只能用 GET 方式可以正常访问,其他方式全部会出现跨域问题

于是在查阅大量资料后得知,出现这种问题是因为我没有明确的指定方法访问的具体方式或允许跨域的请求方式。

解决方法也很简单:
     一、在 @RequestMapping 中使用 method 指定具体的请求方式或 @GetMapping、@PostMapping 这样的明确请求方式的注解

@RequestMapping(value = "/delete/{id}",method = RequestMethod.DELETE)
public Result<Boolean> delete(@PathVariable("id")int id){
	if (hospitalSetService.removeById(id)){
		return Result.ok();
	}else {
		return Result.no("删除失败,请重试。");
	}
}

@PostMapping("/add")
public Result add(HospitalSet hospital){
	hospital.setIsDeleted(0);
	hospital.setStatus(1);
	Random rd = new Random();
	hospital.setSignKey(MD5.encrypt(System.currentTimeMillis() + "" + rd.nextInt(1000)));
	boolean save = hospitalSetService.save(hospital);
	if (save){
		return Result.ok();
	}else {
		return Result.no("保存失败!");
	}
}

     二、在 @CrossOrigin 注解中用 methods 中指定允许跨域的请求方式

@RestController
@RequestMapping("/admin/hospitalSet")
@CrossOrigin(methods = {RequestMethod.DELETE,RequestMethod.GET,RequestMethod.POST,RequestMethod.PUT})
public class HospitalSetController {
	......
}