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

昨天在项目前后端联调时遇到了跨域问题,于是就在 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 方式可以正常访问,其他方式全部会出现跨域问题
img

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

解决方法也很简单:
一、在 [@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 {
    ......
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值