1. 程式人生 > 其它 >java後端解決跨域問題

java後端解決跨域問題

技術標籤:Spring Boot

java後端解決跨域問題

##首先我門要知道什麼是跨域:

跨域是指 不同域名之間相互訪問。跨域,指的是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript施加的安全限制。

也就是如果在A網站中,我們希望使用Ajax來獲得B網站中的特定內容
如果A網站與B網站不在同一個域中,那麼就出現了跨域訪問問題。

##什麼是同一個域?
同一協議,同一ip,同一埠,三同中有一不同就產生了跨域。

#前端解決跨域:
前邊也說了,跨域是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript施加的安全限制。

解決:
所以搞一個node 伺服器做代理,發出請求到node 伺服器,node伺服器轉發到後端就可以繞過跨域問題。

1、後端解決跨域問題:
後端解決就比較簡單了。例如我用的springboot,只用在Controller類上新增一個“@CrossOrigin“註解就可以實現對當前controller 的跨域 訪問了,當然這個標籤也可以加到方法上。

@RequestMapping(value = "/users")
@RestController
@CrossOrigin
public class UserController {
	
	@Autowired
	private UserService userService;

    @RequestMapping(method = RequestMethod.POST)
    @CrossOrigin
    public User create(@RequestBody @Validated User user) {
		return userService.create(user);
    }
   }

#相關知識:
CSRF是什麼?

CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。

2、
新建跨域配置檔案如下即可

/**
 * @author yyb
 */
@Configuration
public class CorsConfiguration {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowCredentials(false)
                        .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                        .allowedOrigins("*");
            }
        };
    }

}

3、使用過濾器

允許整個專案跨域訪問,可通過filter來進行過慮:

public class SimpleCORSFilter implements Filter{  
  
    @Override  
    public void destroy() {  
          
    }  
  
    @Override  
    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");  
            chain.doFilter(req, res);  
          
    }  
  
    @Override  
    public void init(FilterConfig arg0) throws ServletException {  
          
    }  
  
}

在web.xml中需要新增如下配置:

<filter>  
      <filter-name>cors</filter-name>  
      <filter-class>com.ssm.web.filter.SimpleCORSFilter</filter-class>  
    </filter>  
    <filter-mapping>  
      <filter-name>cors</filter-name>  
      <url-pattern>/*</url-pattern>  
    </filter-mapping>
</filter>

為單個方法提供跨域訪問,直接新增請求頭:

       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");

4、後臺Http請求轉發

使用HttpClinet轉發進行轉發(簡單的例子 不推薦使用這種方式)

try {
    HttpClient client = HttpClients.createDefault();            //client物件
    HttpGet get = new HttpGet("http://localhost:8080/test");    //建立get請求
    CloseableHttpResponse response = httpClient.execute(get);   //執行get請求
    String mes = EntityUtils.toString(response.getEntity());    //將返回體的資訊轉換為字串
    System.out.println(mes);
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

5、後臺配置同源Cors (推薦)

在SpringBoot2.0 上的跨域 用以下程式碼配置 即可完美解決你的前後端跨域請求問題

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;
/**
 * 實現基本的跨域請求
 * @author linhongcun
 *
 */
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        /*是否允許請求帶有驗證資訊*/
        corsConfiguration.setAllowCredentials(true);
        /*允許訪問的客戶端域名*/
        corsConfiguration.addAllowedOrigin("*");
        /*允許服務端訪問的客戶端請求頭*/
        corsConfiguration.addAllowedHeader("*");
        /*允許訪問的方法名,GET POST等*/
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

6、使用SpringCloud閘道器

服務閘道器(zuul)又稱路由中心,用來統一訪問所有api介面,維護服務。
Spring Cloud Zuul通過與Spring Cloud Eureka的整合,實現了對服務例項的自動化維護,所以在使用服務路由配置的時候,我們不需要向傳統路由配置方式那樣去指定具體的服務例項地址,只需要通過Ant模式配置檔案引數即可

7、使用nginx做轉發

現在有兩個網站想互相訪問介面 在http://a.a.com:81/A中想訪問http://b.b.com:81/B那麼進行如下配置即可
然後通過訪問www.my.com/A裡面即可訪問www.my.com/B

s

erver {
        listen       80;
        server_name  www.my.com;
        location /A {
            proxy_pass  http://a.a.com:81/A;
            index  index.html index.htm;
        }
        location /B {
            proxy_pass  http://b.b.com:81/B;
            index  index.html index.htm;
        }
    }

如果是兩個埠想互相訪問介面 在http://b.b.com:80/Api中想訪問http://b.b.com:81/Api那麼進行如下配置即可
使用nginx轉發機制就可以完成跨域問題

server {
        listen       80;
        server_name  b.b.com;
        location /Api {
            proxy_pass  http://b.b.com:81/Api;
            index  index.html index.htm;
        }
    }

參考:

https://abelyang.blog.csdn.net/article/details/71436415

https://blog.csdn.net/qq_37651267/article/details/93367870