最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年07月17日 10:52:30   作者:dying 擱淺  
這篇文章主要介紹了SpringBoot+Spring Security無法實(shí)現(xiàn)跨域的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(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)目采用了前后端分離的框架,前端和后臺接口沒有部署到一個(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)上查資料得知,跨域請求會進(jìn)行兩次。具體流程見下圖:

這里寫圖片描述

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

這里寫圖片描述

但是該請求不能攜帶cookie和自己定義的header。

由于項(xiàng)目中引入了Spring security ,而我使用的token傳遞方式是在header中使用authorization 字段,這樣依賴Spring Security攔截到 preflight request 發(fā)現(xiàn)它沒有攜帶token,就會報(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 
    }

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

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

相關(guān)文章

最新評論

大同市| 昌宁县| 奉化市| 陇西县| 南陵县| 高邮市| 长垣县| 开鲁县| 周口市| 名山县| 延津县| 皮山县| 杂多县| 黔南| 新营市| 吴堡县| 定远县| 巍山| 琼结县| 湖州市| 绥芬河市| 广汉市| 新乡县| 渭源县| 兰溪市| 双峰县| 体育| 普宁市| 宁波市| 澄迈县| 三门县| 钟山县| 离岛区| 莎车县| 南安市| 涟水县| 称多县| 北京市| 突泉县| 中山市| 定南县|