欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot+Spring Security無法實(shí)現(xiàn)跨域的解決方案

 更新時(shí)間:2021年07月17日 10:52:30   作者:dying 擱淺  
這篇文章主要介紹了SpringBoot+Spring Security無法實(shí)現(xiàn)跨域的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot+Spring Security無法實(shí)現(xiàn)跨域

未使用Security時(shí)跨域:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
@AutoConfigureBefore(SecurityConfig.class)
public class MyMvcConfigurer implements WebMvcConfigurer {
    public void addCorsMappings(CorsRegistry registry){
        LOGGER.info("跨域已設(shè)置");
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

整合Security時(shí)發(fā)現(xiàn)只用上述方法前后端分離時(shí)仍存在跨域問題,

解決方法如下:

@Configuration
@AutoConfigureBefore(Swagger2Configuration.class)
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(-1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .loginProcessingUrl("/user/login")
                .loginPage("/singIn.html")
                .successHandler(moyuAuthenticationSuccessHandler)
                .failureHandler(moyuAuthenticationFailureHandler)
                .and()
                .apply(moyuSocialSecurityConfig)
                .and()
                .rememberMe()
                .tokenRepository(persistentTokenRepository())
                .tokenValiditySeconds(3600*24*7)
                .userDetailsService(userDetailsService)
                .and()
                .authorizeRequests()
                .antMatchers("/user/login","/login","/singIn.html","**","/**").permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .cors()
                .and()
                .csrf().disable();
    }
}

重點(diǎn)加入代碼:

   .and()
   .cors()//新加入
   .and()
   .csrf().disable();

引用Spring Security 項(xiàng)目的跨域處理

最近項(xiàng)目采用了前后端分離的框架,前端和后臺(tái)接口沒有部署到一個(gè)站點(diǎn),出現(xiàn)了跨域問題,什么是跨域,這里就不再贅述,直接說解決辦法。

Spring 解決跨域的方式有很多,個(gè)人采用了Crosfilter的方式

具體代碼如下:

@Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new      UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }

配置完成后,測試調(diào)用,報(bào)錯(cuò)401,依然不行。網(wǎng)上查資料得知,跨域請(qǐng)求會(huì)進(jìn)行兩次。具體流程見下圖:

這里寫圖片描述

每次跨域請(qǐng)求,真正請(qǐng)求到達(dá)后端之前,瀏覽器都會(huì)先發(fā)起一個(gè)preflight request,請(qǐng)求方式為OPTIONS 詢問服務(wù)端是否接受該跨域請(qǐng)求,具體參數(shù)如下圖:

這里寫圖片描述

但是該請(qǐng)求不能攜帶cookie和自己定義的header。

由于項(xiàng)目中引入了Spring security ,而我使用的token傳遞方式是在header中使用authorization 字段,這樣依賴Spring Security攔截到 preflight request 發(fā)現(xiàn)它沒有攜帶token,就會(huì)報(bào)錯(cuò)401,沒有授權(quán)。

解決這個(gè)問題很簡單,可以使用以下配置

讓Spring security 不校驗(yàn)preflight request 。

 @Override
    public void configure(HttpSecurity http) throws Exception {
        ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry 
        = http.authorizeRequests();
        registry.requestMatchers(CorsUtils::isPreFlightRequest).permitAll();//讓Spring security放行所有preflight request 
    }

再試就搞定了,但是后端直接配置支持跨域會(huì)導(dǎo)致兩次請(qǐng)求。還使用另一種方式,使用Nginx 轉(zhuǎn)發(fā)一下請(qǐng)求也可以。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot jar中沒有主清單屬性的解決方法

    Spring Boot jar中沒有主清單屬性的解決方法

    這篇文章主要介紹了Spring Boot jar中沒有主清單屬性的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • java實(shí)現(xiàn)計(jì)算地理坐標(biāo)之間的距離

    java實(shí)現(xiàn)計(jì)算地理坐標(biāo)之間的距離

    java實(shí)現(xiàn)計(jì)算地理坐標(biāo)之間的距離,主要是通過計(jì)算兩經(jīng)緯度點(diǎn)之間的距離來實(shí)現(xiàn),有需要的小伙伴參考下吧
    2015-03-03
  • Java實(shí)現(xiàn)驗(yàn)證碼的產(chǎn)生和驗(yàn)證

    Java實(shí)現(xiàn)驗(yàn)證碼的產(chǎn)生和驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)驗(yàn)證碼的產(chǎn)生和驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2012-01-01
  • 對(duì)spring task和線程池的深入研究

    對(duì)spring task和線程池的深入研究

    這篇文章主要介紹了對(duì)spring task和線程池的深入研究,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • JDK14之jpackage打包命令的使用

    JDK14之jpackage打包命令的使用

    這篇文章主要介紹了JDK14之jpackage打包命令的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • java設(shè)計(jì)模式之觀察者模式

    java設(shè)計(jì)模式之觀察者模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之觀察者模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 讓Java代碼更高效

    讓Java代碼更高效

    這篇文章主要介紹了如何讓你的Java代碼更高效,讓Java跑得更快,感興趣的小伙伴們可以參考一下
    2015-09-09
  • springboot如何使用sm2加密傳輸

    springboot如何使用sm2加密傳輸

    這篇文章主要介紹了springboot如何使用sm2加密傳輸問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Spring測試 其實(shí)很簡單

    Spring測試 其實(shí)很簡單

    這篇文章主要為大家詳細(xì)介紹了Spring測試,其實(shí)很簡單,揭開集成測試神秘的面紗,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 教你如何使用Java8實(shí)現(xiàn)菜單樹形數(shù)據(jù)

    教你如何使用Java8實(shí)現(xiàn)菜單樹形數(shù)據(jù)

    今天給大家?guī)淼氖顷P(guān)于JAVA的相關(guān)知識(shí),文中圍繞著如何使用Java8實(shí)現(xiàn)菜單樹形數(shù)據(jù)展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論