解决前后端交互中出现的跨域问题(基于Springboot和Vue3)

解决前后端交互中出现的跨域问题(基于Springboot和Vue3)

一、问题描述

二、问题解决

在 Spring Boot 项目的 Java 代码中,创建一个配置类来处理 CORS。例如,在config包下创建CorsConfig.java文件,内容如下:

2.1允许所有地址访问的情形

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // 允许所有来源,生产环境建议指定前端具体域名,如 config.addAllowedOrigin("http://localhost:8089");
        config.addAllowedOrigin("*"); 
        config.addAllowedMethod("*"); // 允许所有HTTP方法,如GET、POST、PUT、DELETE等
        config.addAllowedHeader("*"); // 允许所有请求头
        config.setAllowCredentials(true); // 允许携带凭证,如cookie

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config); // 对所有接口生效,也可指定特定路径,如"/api/**"

        return new CorsFilter(source);
    }
}

2.2允许指定地址访问的情形

package com.hechixueyuan.Student_Mannage_System_h.config;

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

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8089") // 允许的前端地址
//                .allowedOrigins("*") // 允许的前端地址
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600); // 预检请求缓存时间
    }
}

注意“.allowedOrigins(“*”) (表示 允许的前端地址)“,与“ .allowCredentials(true)(表示允许携带凭证(如Cookie))”是不能同时出现的,这在 CORS 规范中是冲突的

(如果报的是axios或者element-plus的问题可以试图清除缓存,重新加载依赖,同时注意在man.js文件中配置相关的包等。)

### 实现Spring BootVue 3之间交互的方法 #### 使用Axios发起HTTP请求 在前端部分,可以借助`axios`库来向后端发送GET、POST等类型的HTTP请求。对于GET请求而言,可以通过两种方式传递参数给服务器:一种是在查询字符串中附加键值对;另一种则是利用对象的形式指定参数属性[^3]。 ```javascript // 定义Vue实例并挂载至DOM容器 const app = Vue.createApp({ data() { return { emp1: "", emp2: "" } }, methods: { // 方法一:以对象形式设置params选项内的字段名及其对应的取值 btn(){ axios.get("http://localhost:8080/test/selectbyid",{ params:{ id:1 } }).then(response => { console.log(response); this.emp1=response.data.data; }).catch(error=>{ console.error(&#39;失败&#39;, error); }); }, // 方法二:直接把所需的数据项追加到URL路径后的问号之后 btn2(){ axios.get(`http://localhost:8080/test/selectbyid?id=${encodeURIComponent(1)}`).then((response)=>{ console.log(response); this.emp2=response.data.data; }).catch(error=>console.error(&#39;失败&#39;,error)); } } }); app.mount("#app"); ``` 为了增强系统的可维护性安全性,在实际应用中通常还会引入一些额外的设计模式技术手段: - **统一异常处理机制**:当遇到网络错误或者业务逻辑上的问题时能够给出友好的提示信息; - **资源共享(CORS)**:允许来自不同源的客户端访问受保护资源; - **身份验证授权控制**:确保只有合法用户才能执行特定的操作; - **日志记录**:跟踪应用程序的行为以便于调试性能优化分析。 此外,还可以考虑使用RESTful API风格的服务接口设计原则以及JSON Web Token (JWT)来进行会话管理权限校验等工作[^2]。 #### 后端接收并响应请求 在Spring Boot项目里创建控制器类,并通过注解的方式定义映射规则,从而使得接收到对应格式的HTTP请求后能调用相应的处理器函数完成具体任务。例如下面这段代码展示了如何编写一个简单的API endpoint用于接受带有ID参数的GET请求并将结果封装成实体返回给调用方[^1]。 ```java @RestController @RequestMapping("/test") public class TestController { @GetMapping(value="/selectbyid") public ResponseEntity<?> selectById(@RequestParam Integer id){ try { Object result = service.findById(id); // 调用Service层查找数据库中的记录 if(result != null){ return new ResponseEntity<>(result, HttpStatus.OK); }else{ throw new ResourceNotFoundException(); } } catch(Exception e){ logger.error(e.getMessage(),e); return new ResponseEntity<>("Error occurred while fetching the resource.",HttpStatus.INTERNAL_SERVER_ERROR); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值