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

【Java】Java中解決跨域問題的幾種方法(建議收藏)

這篇具有很好參考價值的文章主要介紹了【Java】Java中解決跨域問題的幾種方法(建議收藏)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

我們在開發(fā)過程中經常會遇到前后端分離而導致的跨域問題,導致無法獲取返回結果??缬蚓拖穹蛛x前端和后端的一道鴻溝,君在這邊,她在那邊,兩兩不能往來.

一、什么是跨域?為什么會出現(xiàn)跨域

  • 定義

    • 跨域(CORS)是指不同域名之間相互訪問??缬颍傅氖菫g覽器不能執(zhí)行其他網站的腳本,它是由瀏覽器的同源策略所造成的,是瀏覽器對于JavaScript所定義的安全限制策略。
      當一個請求url的協(xié)議、域名、端口三者之間任意一個與當前頁面url不同即為跨域。
  • 原因

    • 在前后端分離的模式下,前后端的域名是不一致的,此時就會發(fā)生跨域訪問問題。在請求的過程中我們要想回去數據一般都是post/get請求,所以…跨域問題出現(xiàn)。

    • 跨域問題來源于JavaScript的同源策略,即只有 協(xié)議+主機名+端口號(如存在)相同,則允許相互訪問。也就是說JavaScript只能訪問和操作自己域下的資源,不能訪問和操作其他域下的資源。跨域問題是針對JS和ajax的,html本身沒有跨域問題,比如a標簽、script標簽、甚至form標簽(可以直接跨域發(fā)送數據并接收數據)等

  • 什么情況會跨域

    • 同一協(xié)議, 如http或https
    • 同一IP地址, 如127.0.0.1
    • 同一端口, 如8080
      以上三個條件中有一個條件不同就會產生跨域問題。

二、Java實現(xiàn)跨域方式

2.1、返回新的 CorsFilter(全局跨域)

package org.chuancey.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
 
@Configuration
public class GlobalCorsConfig {
 
    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        // 放行哪些原始域
        config.addAllowedOrigin("*");
        // 是否發(fā)送 Cookie
        config.setAllowCredentials(true);
        // 放行哪些請求方式
        config.addAllowedMethod("*");
        // 放行哪些原始請求頭部信息
        config.addAllowedHeader("*");
        // 暴露哪些頭部信息
        config.addExposedHeader("*");
        //2. 添加映射路徑
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
 
}

2.2、重寫 WebMvcConfigurer(全局跨域)

package org.chuancey.config;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@Configuration
public class CorsConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedHeaders("*")
                // 是否發(fā)送Cookie
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "OPTIONS", "DELETE", "PUT", "PATCH")
                .maxAge(3600);
    }
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("doc.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

2.3、使用注解 (局部跨域)

在控制器(類上)上使用注解 @CrossOrigin,表示該類的所有方法允許跨域。

@RestController
@CrossOrigin(origins = "*")
public class VerificationController {
 
}

在方法上使用注解 @CrossOrigin

@PostMapping("/check/phone")
    @CrossOrigin(origins = "*")
    public boolean checkPhoneNumber(@RequestBody @ApiParam VerificationPojo verification) throws BusinessException {
        return false;
    }

2.4、手動設置響應頭(局部跨域)

使用 HttpServletResponse 對象添加響應頭(Access-Control-Allow-Origin)來授權原始域,這里 Origin的值也可以設置為 “*”,表示全部放行。

@RequestMapping("/home")
public String home(HttpServletResponse response) {
    response.addHeader("Access-Allow-Control-Origin","*");
    return "home";
}

2.5、使用自定義filter實現(xiàn)跨域

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
 
@Slf4j
@Configuration
@WebFilter(filterName = "accessFilter", urlPatterns = "/*")
public class MyCorsFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
    chain.doFilter(req, res);
  }
 
  public void init(FilterConfig filterConfig) {log.info("AccessFilter過濾器初始化!");}
 
  public void destroy() {}
}

xml使自定義Filter生效方式

<!-- 跨域訪問 START-->
<filter>
 <filter-name>CorsFilter</filter-name>
 <filter-class>org.chuancey.filter.MyCorsFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>CorsFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 跨域訪問 END  -->

2.6、Spring Cloud Gateway 跨域配置

spring: 
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            # 允許跨域的源(網站域名/ip),設置*為全部
            # 允許跨域請求里的head字段,設置*為全部
            # 允許跨域的method, 默認為GET和OPTIONS,設置*為全部
            allow-credentials: true
            allowed-origins:
              - "http://xb.abc.com"
              - "http://sf.xx.com"
            allowed-headers: "*"
            allowed-methods:
              - OPTIONS
              - GET
              - POST
              - DELETE
              - PUT
              - PATCH
            max-age: 3600

注意: 通過gateway 轉發(fā)的其他項目,不要進行配置跨域配置

有時即使配置了也不會起作用,這時你可以根據瀏覽器控制的錯誤輸出來查看問題,如果提示是 response 中 header 出現(xiàn)了重復的 Access-Control-* 請求頭,可以進行如下操作文章來源地址http://www.zghlxwxcb.cn/news/detail-679714.html

import java.util.ArrayList;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
 
@Component("corsResponseHeaderFilter")
public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {
 
  @Override
  public int getOrder() {
    // 指定此過濾器位于NettyWriteResponseFilter之后
    // 即待處理完響應體后接著處理響應頭
    return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
  }
 
  @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    return chain.filter(exchange).then(Mono.defer(() -> {
      exchange.getResponse().getHeaders().entrySet().stream()
          .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
          .filter(kv -> (
              kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
                  || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)
                  || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)
                  || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS)
                  || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_MAX_AGE)))
          .forEach(kv -> {
            kv.setValue(new ArrayList<String>() {{
              add(kv.getValue().get(0));
            }});
          });
      return chain.filter(exchange);
    }));
  }
}

2.7、使用Nginx配置

location / {
   add_header Access-Control-Allow-Origin *;
   add_header Access-Control-Allow-Headers X-Requested-With;
   add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
 
   if ($request_method = 'OPTIONS') {
     return 204;
   }
}

2.8、繼承 HandlerInterceptorAdapter

@Component
public class CrossInterceptor extends HandlerInterceptorAdapter {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        return true;
    }
}
 

到了這里,關于【Java】Java中解決跨域問題的幾種方法(建議收藏)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • 解決GitHub下載速度太慢問題的方法匯總(持續(xù)更新,建議收藏)

    解決GitHub下載速度太慢問題的方法匯總(持續(xù)更新,建議收藏)

    Github上下載倉庫或者克隆倉庫,速度基本穩(wěn)定在 20k 以下,當克隆一些大的倉庫時,以這烏龜速度,很容易出現(xiàn)克隆超時的錯誤,等了幾十分鐘的下載一夜回到解放前,那種感覺我猜各位或多或少都經歷過。本博客匯總了幾種親測可用的方案,很大地提升下載速度,一個大的

    2024年02月07日
    瀏覽(38)
  • 解決跨域的幾種方式

    利用 script 標簽可以跨域加載資源的特性,通過動態(tài)創(chuàng)建一個 script 標簽,然后將響應數據作為回調函數的參數返回,從而實現(xiàn)跨域請求資源。該方式只支持 GET 請求方式,且不支持發(fā)送 POST 等其它請求。 客戶端代碼: 服務端應返回如下格式的響應數據: 客戶端創(chuàng)建一個 sc

    2024年02月09日
    瀏覽(89)
  • vue解決跨域的幾種辦法

    vue解決跨域的幾種辦法

    當我們遇到請求后臺接口遇到 Access-Control-Allow-Origin 時,那說明跨域了。 跨域是因為瀏覽器的同源策略所導致,同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,同源是指:域名、協(xié)議、端口相同 解決跨域常用方法: 一、VUE中常用proxy來解決跨

    2024年02月15日
    瀏覽(95)
  • 如何解決電腦無聲問題:排除故障的幾種常見方法

    如何解決電腦無聲問題:排除故障的幾種常見方法

    大家好,今天我們來討論一下處理電腦沒有聲音的故障。當你突然發(fā)現(xiàn)電腦靜音無聲時,需要逐步排除可能的問題,但總體而言,聲音故障是相對容易解決的。接下來,我們將介紹一些排除電腦無聲問題的方法。 第一步:檢查是否處于靜音或音響線松動狀態(tài)。 檢查是否處于

    2024年02月14日
    瀏覽(24)
  • 怎么把視頻中的水印去除?建議收藏這幾種去水印方法

    怎么把視頻中的水印去除?建議收藏這幾種去水印方法

    如何給視頻去水印呢?我們在將網上保存下來的的視頻進行編輯的時候,經常會看到視頻中帶有水印。這些帶有水印的視頻在后期剪輯的過程中,會使整個畫面看起來不統(tǒng)一、不和諧,所以一般在編輯的過程中我們都會選擇去除視頻中的水印。那么要怎么給視頻去水印呢?有

    2023年04月09日
    瀏覽(33)
  • 解決npm ERR code ENOENT問題的幾種方法

    解決npm ERR code ENOENT問題的幾種方法

    一定要是最里面的目錄才能生效,否則它可能會提示: 這時候關掉項目,找到正確路徑再打開就可以 可以試試刪除本地node_modules文件夾,之后再次npm install 這是官網連接Node.js (nodejs.org) 這是中文網下載連接下載 | Node.js 中文網 (nodejs.cn)

    2024年02月16日
    瀏覽(26)
  • 抓緊收藏,Selenium無法定位元素的幾種解決方案

    抓緊收藏,Selenium無法定位元素的幾種解決方案

    01、frame/iframe表單嵌套 WebDriver只能在一個頁面上對元素識別與定位,對于frame/iframe表單內嵌的頁面元素無法直接定位。 解決方法 : driver.switch_to.frame ( id/name/obj ) switch_to.frame()默認可以直接取表單的id或name屬性。如果沒有可用的id和name屬性,可以先定位到frame/iframe,再將定位

    2024年02月20日
    瀏覽(17)
  • Java格式化日期,時間(三種方法,建議收藏)

    Java格式化日期,時間(三種方法,建議收藏)

    在java中String類格式化的方法,是靜態(tài)format()用于創(chuàng)建格式化的字符串。 format(String format, Object...?args) 新字符串使用本地語言環(huán)境,制定字符串格式和參數生成格式化的新字符串。 format(Locale locale, String format, Object... args) 使用指定的語言環(huán)境,制定字符串格式和參數生成格式化

    2024年02月15日
    瀏覽(20)
  • 實現(xiàn)跨域的幾種方式

    實現(xiàn)跨域的幾種方式

    前后端的分離導致了跨域的產生 ?跨域的三要素:協(xié)議 域名 端口 三者有一個不同即產生跨域 例如: http ://www.csdn.com https ://www.csdn.com 由于協(xié)議不同,端口不同而產生跨域 注:http的默認端口80,https的默認端口443 跨域的解決方案 前端:webpack proxy,jsonp,ngix反向代理,webpac

    2024年02月13日
    瀏覽(24)
  • 解決哈希沖突的幾種方法

    解決哈希沖突的幾種方法

    哈希函數是一個映像,把任意長度的輸入,通過Hash算法變換成固定長度的輸出,這個輸出就是Hash值; 當兩個不同的輸入,產生了同一個輸出值即為哈希沖突 開放尋址法的核心思想是, 如果出現(xiàn)了散列沖突,我們就重新探測一一個空閑位置,將其插入 。比如,我們可以使用

    2024年01月17日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包