国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Security系列教程之解決Spring Security環(huán)境中的跨域問題

這篇具有很好參考價(jià)值的文章主要介紹了Spring Security系列教程之解決Spring Security環(huán)境中的跨域問題。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一. 啟用Spring Security 的CORS支持

1. 普通的跨域
方式1:在接口方法上利用@CrossOrigin注解解決跨域問題
@RestController
public class IndexController {

    @CrossOrigin(value = "http://localhost:8082")
    @GetMapping("/hello")
    public String hello() {

        return "get hello";
    }

    @CrossOrigin(value = "http://localhost:8082")
    @PostMapping("/hello")
    public String hello2() {

        return "post hello";
    }
}
方式2:通過實(shí)現(xiàn)WebMvcConfigurer接口來解決跨域問題
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8082")
                .allowedMethods("*")
                .allowedHeaders("*");
    }

}

二. Spring Security環(huán)境下的跨域問題解決

通過上面的配置,我們已經(jīng)解決了Ajax的跨域請求問題,但是這個(gè)案例中也有潛在的威脅存在,常見的就是 CSRF(Cross-site request forgery) 跨站請求偽造。跨站請求偽造也被稱為 one-click attack 或者 session riding,通??s寫為 CSRF 或者 XSRF,是一種挾制用戶在當(dāng)前已登錄的 Web 應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。

所以為了提高網(wǎng)站的安全性,我在上面Spring Boot項(xiàng)目的基礎(chǔ)之上,添加Spring Security的依賴包,但是暫時(shí)不進(jìn)行任何別的操作。

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

Spring Security系列教程之解決Spring Security環(huán)境中的跨域問題

2. 解決Spring Security環(huán)境下跨域問題的4種方案

通過實(shí)驗(yàn)可知,如果使用了 Spring Security,上面的跨域配置會(huì)失效,因?yàn)檎埱髸?huì)被 Spring Security 攔截。那么在Spring Security環(huán)境中,如何解決跨域問題呢?這里我們有3種方式可以開啟 Spring Security 對跨域的支持。

2.1 方式一:開啟cors方法

我們在上面的案例之上,編寫一個(gè)SecurityConfig配置類,在configure方法中,利用cors() 開啟Spring Security 對 CORS 的支持:

public class SecurityConfig extends WebSecurityConfigurerAdapter {

 @Override
 protected void configure(HttpSecurity http) throws Exception {
     http.authorizeRequests()
             .anyRequest()
             .permitAll()
             .and()
             .formLogin()
             .permitAll()
             .and()
             .httpBasic()
             .and()
             //支持跨域訪問
             .cors()
             .and()
             .csrf()
             .disable();
 }

}
2.2 方式二:進(jìn)行全局配置

第二種方式是去除上面的跨域配置,直接在 Spring Security 中做全局配置,如下:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest()
                .permitAll()
                .and()
                .formLogin()
                .permitAll()
                .and()
                .httpBasic()
                .and()
                //支持跨域訪問
                .cors()
                .configurationSource(corsConfigurationSource())
                .and()
                .csrf()
                .disable();
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowCredentials(true);
        configuration.setAllowedOrigins(Collections.singletonList("*"));
        configuration.setAllowedMethods(Collections.singletonList("*"));
        configuration.setAllowedHeaders(Collections.singletonList("*"));
        configuration.setMaxAge(Duration.ofHours(1));
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

}

以上2個(gè)方法,都可以實(shí)現(xiàn)在Spring Security環(huán)境下的跨域訪問。

2.3 方式三:支持OAuth2的跨域訪問

我們開發(fā)時(shí),還有一種情況就是支持 OAuth2 相關(guān)接口的跨域,比如用戶要訪問 OAuth2 中的 /oauth/token 等接口。我們可以配置一個(gè)全局的 CorsFilter 跨域過濾器類,核心代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-454877.html

/**
* 跨域配置方式3:定義全局跨域過濾器
**/
@Configuration
public class GlobalCorsConfiguration {

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

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //跨域方式3:
        http.requestMatchers()
                .antMatchers(HttpMethod.OPTIONS, "/oauth/**")
                .and()
                .csrf()
                .disable()
                .formLogin()
                .and()
                .cors();
    }
}
2.4 方式4 :自定義一個(gè)全局跨域處理Filter
public class CorsFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
            FilterChain filterChain) throws ServletException, IOException {
        String orignalHeader = StringUtils.defaultIfBlank(request.getHeader("Origin"), "*");
        // 指定本次預(yù)檢請求的有效期
        response.setHeader("Access-Control-Max-Age", "3600");
        // 服務(wù)器支持的所有頭信息字段
        response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
        response.setHeader("Access-Control-Allow-Origin", orignalHeader);
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        filterChain.doFilter(request, response);
    }
}

public class WebMvcConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(new CorsFilter (), WebAsyncManagerIntegrationFilter.class);
    }
}

到了這里,關(guān)于Spring Security系列教程之解決Spring Security環(huán)境中的跨域問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Spring security 解決跨域】

    【Spring security 解決跨域】

    主頁傳送門:?? 傳送 ??Spring Security是一個(gè)功能強(qiáng)大且高度可定制的,主要負(fù)責(zé)為Java程序提供聲明式的身份驗(yàn)證和訪問控制的安全框架。其前身是Acegi Security,后來被收納為Spring的一個(gè)子項(xiàng)目,并更名為了Spring Security。Spring Security的底層主要是基于Spring AOP和Servlet過濾器來實(shí)

    2024年02月13日
    瀏覽(18)
  • Spring Security——09,解決跨域

    Spring Security——09,解決跨域

    瀏覽器出于安全的考慮,使用 XMLHttpRequest對象發(fā)起 HTTP請求時(shí)必須遵守同源策略,否則就是跨 域的HTTP請求,默認(rèn)情況下是被禁止的。 同源策略要求源相同才能正常進(jìn)行通信,即協(xié)議、域名、端口號(hào)都完全一致。 前后端分離項(xiàng)目,前端項(xiàng)目和后端項(xiàng)目一般都不是同源的,所以

    2024年04月15日
    瀏覽(21)
  • 系列二、Spring Security中的核心類

    系列二、Spring Security中的核心類

    1.2.1、概述 ????????Spring Security 提供了多種密碼加密方案,官方推薦使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 強(qiáng)哈希函數(shù),開發(fā)者在使用時(shí)可以選擇提供 strength 和 SecureRandom 實(shí)例。strength 越大,密鑰的迭代次數(shù)越多,密鑰迭代次數(shù)為 2^strength。strength 取值在 4~3

    2024年02月01日
    瀏覽(24)
  • 系列六、Spring Security中的認(rèn)證 & 授權(quán) & 角色繼承

    系列六、Spring Security中的認(rèn)證 & 授權(quán) & 角色繼承

    ? ? ? ? 關(guān)于Spring Security中的授權(quán),請參考【系列一、認(rèn)證 授權(quán)】,這里不再贅述。 1.4.1、admin登錄 (一) 登錄 (二) 訪問sayHi(登錄就可以訪問) (三)訪問/admin/helloWorld接口(需要擁有admin角色)? (四)訪問/dba/helloWorld接口(需要擁有dba角色,admin自動(dòng)繼承dba角色)

    2024年02月01日
    瀏覽(28)
  • 解決vite的跨域問題

    vue需要配置自定義代理規(guī)則進(jìn)行跨域訪問 官方文檔:https://cn.vitejs.dev/config/server-options.html#server-proxy 在vite.config.ts修改: 發(fā)起請求的地方: 生產(chǎn)環(huán)境配置跨域,還需要編輯nginx的配置文件,在 server 對象中再添加一個(gè) location 對象(別忘了上一個(gè)對象末尾的分號(hào) ; )

    2024年02月04日
    瀏覽(14)
  • 常見的跨域解決方案

    常見的跨域解決方案: 跨域問題可以分為兩種情況: 前端跨域和后端跨域 。以下是針對這兩種情況的跨域解決方案: 前端跨域解決方案: JSONP: 適用于前端向不同域名下的服務(wù)器請求數(shù)據(jù),通過添加回調(diào)函數(shù)名稱來實(shí)現(xiàn)跨域數(shù)據(jù)獲取。 CORS: 當(dāng)前端向服務(wù)器請求數(shù)據(jù)時(shí),

    2024年02月12日
    瀏覽(25)
  • 跨域問題?無需擔(dān)心!學(xué)習(xí)如何解決 Axios 的跨域限制

    跨域問題?無需擔(dān)心!學(xué)習(xí)如何解決 Axios 的跨域限制

    跨域是指訪問另外一個(gè)域的資源,由于瀏覽器的同源策略,默認(rèn)情況下使用 XMLHttpRequest 和 Fetch 請求時(shí)是不允許跨域的??缬虻母驹蚴菫g覽器的同源策略,這是由瀏覽器對 JavaScript 施加的安全限制。 跨域請求被阻止 (Cross-Origin Request Blocked) : 這是由瀏覽器實(shí)施的同源策略

    2024年04月27日
    瀏覽(20)
  • 系列四、Spring Security中的認(rèn)證 & 授權(quán)(前后端不分離)

    系列四、Spring Security中的認(rèn)證 & 授權(quán)(前后端不分離)

    1.3.1、概述 ? ? ? ? 前后端不分離的登錄成功回調(diào)有兩個(gè)關(guān)鍵方法,即:defaultSuccessUrl 和?successForwardUrl。那么它們之間的區(qū)別是什么呢?? ? ? ? (1)successForwardUrl 表示不管你是從哪里來的,登錄后一律跳轉(zhuǎn)到 successForwardUrl 指定的地址。例如 successForwardUrl 指定的地址為/l

    2024年01月19日
    瀏覽(33)
  • 跨域介紹及Java中常見的跨域解決方案

    跨域(Cross-Origin)指的是在瀏覽器中,由于安全策略的限制,當(dāng)前網(wǎng)頁的 JavaScript 代碼無法直接訪問不同源(協(xié)議、域名、端口)的資源。這意味著如果網(wǎng)頁嘗試通過 AJAX、Fetch 或 WebSocket 等方式向不同源的服務(wù)器發(fā)送請求,瀏覽器會(huì)阻止這些請求,從而避免潛在的安全風(fēng)險(xiǎn)。

    2024年02月07日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包