security跨域配置

简介: security跨域配置

一、概述

1、什么是跨域

CORS是w3c指定的一种跨域资源共享的请求资源方式,体现就是协议+ip+端口三个相同才是同源,否则就是跨域,早期javaEE解决跨域方案是JSONP,Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。但是jsonp只支持get方式,而CORS支持多种请求方式,是目前主流的跨域解决方案

2、CORS解决跨域过程

cors新增了一组http请求头字段,通过这些字段,服务器告诉浏览器,哪些网络通过浏览器有访问权限,同时规定,对那些可能修改服务器数据的http请求方法(如get以为的http请求等),浏览器首先必须使用options请求发起一个预检请求,预检请求的目的就是查看服务器是否支持即将发起的跨域请求,如果服务端允许才发实际的http请求,在预检请求的返回中,服务端也可以通知客户端,是否需要携带身份凭证,如cookies、http认证信息等

3、简单请求

4、复杂请求

二、跨域解决方案

1、springmvc中的注解方式@CrossOrigin

该注解可以加在方法上也可以加在controller类上,加在类上所有方法支持跨域,@CrossOrigin支持的属性如下

  • alowCredentials:浏览器是否应当发送凭证信息入Cookie
  • allowedHeaders:请求被允许的请求头字段 * 标识所有字段
  • exposedHeaders:哪些响应头可以作为响应的一部分暴露出来
  • maxAge:预检请求的有效期 有效期内不必再次发送预检请求 默认是1800秒
  • methods:允许的请求方法 * 标识允许所有的方法
  • origins:允许的域 可以多个,* 标识允许所有的域

   @RequestMapping("/touser")

   @CrossOrigin(origins = {"localhost:8081","localhost:8082"})

   public String toUser(){

       return "user";

   }

2、springmvc中的配置方式

自定义springmvc配置WebMvcConfigurer类中的addCorsMappings方法 全局处理

@Configuration
public class ConfigMy implements WebMvcConfigurer {
    /**
     * 跨域
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")//对哪些请求进行跨域
                .allowedOrigins("http://localhost:8082","http://localhost:8081","http://localhost:8080")
                .allowCredentials(false)
                .allowedMethods("GET", "POST")
                .allowedHeaders("*")
                .maxAge(3600);
    }
}

3、spring web过滤器CrosFilter方式

@Configuration
public class ConfigMy {
    @Bean
    FilterRegistrationBean<CorsFilter> corsFilter(){
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<CorsFilter>();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
        corsConfiguration.setAllowedMethods(Arrays.asList("*"));
        corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:8080"));
        corsConfiguration.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);
        registrationBean.setFilter(new CorsFilter(source));
        //指定filter顺序 -1标识在所有内置filter之前执行
        registrationBean.setOrder(-1);
        return registrationBean;
    }
}

4、springsecurity跨域解决方案

引入security之后上面的@ CrossOrigin和配置方式都会失效,crosfilter是否失效取决于过滤器和security自带过滤器顺序

filter 、dispatchserServlet以及intercepter执行顺序

client->web filter(sercurity filter)->dispatchserServlet->intercepter->controller

对于非简单请求都会发起一个预检请求,预检请求不会携带认证信息,所以会被security拦截,因此通过@ CrossOrigin和配置处理跨域都是失效的,如果crosfilter执行顺序高于security,那有效的,security解决跨域方式

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and().formLogin()
                //增加跨域以及相关配置
                .and().cors().configurationSource(configurationSource())
                .and().csrf().disable();
    }
    //跨域配置
    CorsConfigurationSource configurationSource(){
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
        corsConfiguration.setAllowedMethods(Arrays.asList("*"));
        corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:8080"));
        corsConfiguration.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);
        return source;
    }
}



相关文章
|
Java Spring
springboot跨域配置
springboot跨域配置
520 0
|
XML 安全 前端开发
Spring Security—Spring MVC 整合
Spring Security—Spring MVC 整合
509 1
|
8月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
954 2
|
安全 JavaScript Java
SpringBoot解决跨域最佳实践
本文介绍了跨域问题的起因及最佳实践,重点讲解了SpringBoot中如何利用`CorsFilter`解决跨域问题。首先解释了由于浏览器的同源策略限制导致的跨域现象,然后提出了在服务端入口处解决跨域问题的建议,最后详细展示了三种SpringBoot中配置跨域的方法:使用默认配置、自定义配置规则以及通过配置文件管理跨域设置,以适应不同的应用场景。
613 5
|
12月前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
8970 2
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
|
安全 Java API
实现跨域请求:Spring Boot后端的解决方案
本文介绍了在Spring Boot中处理跨域请求的三种方法:使用`@CrossOrigin`注解、全局配置以及自定义过滤器。每种方法都适用于不同的场景和需求,帮助开发者灵活地解决跨域问题,确保前后端交互顺畅与安全。
1644 0
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
SQL 前端开发 关系型数据库
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略
20100 6
IDEA统计项目代码量
IDEA统计项目代码量
722 0