Springboot解决ajax跨域问题

本文介绍了解决SpringBoot项目中Vue前端通过AJAX与后端通信时遇到的跨域问题,重点讲述了如何在Spring Security中添加跨域处理函数,包括配置`OPTIONS`请求允许、设置CORS策略,确保在启用JWT认证后仍能正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述: 本人在做springboot项目时,前端用的是vue框架,然后使用ajax与后端通信,但是前端首先会发一个Option跨域请求,我的后端没有对这个进行处理,前端具体报错见下图。由于我后端加了security jwt token机制,所以网上其他人的解决方案都缺少了security类的具体设置,导致还是会跨域,查询了大量资料后发现只需要在security上加一些字段就可以解决,亲测有效。
请添加图片描述
解决方案

  • 在security中添加跨域处理函数
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	
	//...省略

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.userDetailsService(userDetailsService());
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //使用JWT,不需要csrf
        http.csrf()
                .disable()
                //基于token,不需要session
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                //允许所有跨域验证的option请求
                .antMatchers(HttpMethod.OPTIONS).permitAll() //允许所有options请求,即js跨域请求不拦截
                //允许登录和注册访问
                .antMatchers("/user/login","/user/register","/user/captcha").permitAll()
                //除上面外,所有请求都要求认证
                .anyRequest()
                .authenticated()
                .and()
                //设置javascript跨域验证配置,
                .cors().configurationSource(CorsConfigurationSource())
                .and()
                //禁用缓存
                .headers()
                .cacheControl();
        //添加jwt 登录授权过滤器
        http.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
        //添加自定义未授权和未登录结果返回
        http.exceptionHandling()
                .accessDeniedHandler(restfulAccessDeniedHandler)
                .authenticationEntryPoint(restAuthenticationEntryPoint);
    }



    private CorsConfigurationSource CorsConfigurationSource() {
        CorsConfigurationSource source =   new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");	//同源配置,*表示任何请求都视为同源,若需指定ip和端口可以改为如“localhost:8080”,多个以“,”分隔;
        corsConfiguration.addAllowedHeader("*");//header,允许哪些header,本案中使用的是token,此处可将*替换为token;
        corsConfiguration.addAllowedMethod("*");	//允许的请求方法,PSOT、GET等
        ((UrlBasedCorsConfigurationSource) source).registerCorsConfiguration("/**",corsConfiguration); //配置允许跨域访问的url
        return source;
    }
}

### Spring Boot 中前后端分离问题解决方案及其原理 #### 一、Spring Boot支持机制 在 Spring Boot 应用中,可以通过配置解决资源共享(CORS, Cross-Origin Resource Sharing)的问题。具体来说,有两种主要方式可以实现这一目标[^1]。 一种方法是在控制器类或者特定的方法上使用 `@CrossOrigin` 注解。这种方式适合于细粒度控制某些接口的行为。例如: ```java @RestController @RequestMapping("/api") public class MyController { @CrossOrigin(origins = "http://example.com") // 允许来自 example.com 的请求 @GetMapping("/data") public String getData() { return "Data from backend"; } } ``` 另一种更全局化的方式是通过定义一个 Web 配置类并扩展 `WebMvcConfigurer` 接口。这种方法适用于整个应用程序级别的设置。以下是示例代码: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 对所有的路径生效 .allowedOrigins("http://example.com", "http://anotherdomain.com") // 允许的名 .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的 HTTP 方法 .allowedHeaders("*"); // 允许的头部字段 } } ``` 这两种方式都可以有效解决问题,并且可以根据实际需求灵活选择适用范围更大的全局配置还是针对单个 API 的局部配置。 #### 二、问题产生的原因及工作原理 当浏览器尝试向不同于当前页面所在发起 AJAX 请求时,默认情况下会受到同源策略 (Same-Origin Policy) 的限制。为了绕过这种限制,现代浏览器引入了 CORS 协议作为标准解决方案之一。服务器端需要显式声明哪些外部站点被授权能够访问其资源;而客户端则依据接收到的服务端响应头判断是否继续执行后续操作[^3]。 对于基于 Spring Cloud 构建的企业级微服务架构而言,除了基本功能外还可能涉及更多复杂场景下的安全性考量以及性能优化等问题[^2]。因此,在设计初期就应该充分考虑到这些因素以便更好地满足业务需求的同时保障系统的稳定性和可靠性。 #### 三、面试常见关注点分析 关于 Spring Boot 实现前后端分离过程中遇到的难题及相关知识点,在参加技术岗位招聘考试时常会被问到以下几个方面: - **核心概念理解**:清楚什么是同源策略?为什么会出现现象? - **常用解决办法对比**:分别阐述注解形式与全局配置各自的优劣势是什么? - **实践中的注意事项**:比如生产环境中如何平衡开放程度和数据保护之间的关系? 综上所述,掌握好上述理论基础加上适当的实际案例演练可以帮助求职者更加从容应对此类题目挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值