java後端解決跨域問題
阿新 • • 發佈:2020-12-19
技術標籤: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;
}
}
參考: