一、什麼是跨域問題
1、什麼是同源:同源是指訪問同一個域名、協議和端口號。
2、什麼是跨域:協議、域名、端口號任意一個不同就會出現跨域問題。
3、為什麼要限制跨域:同源策略的目的在於保護用戶隱私,防止惡意網站竊取數據。
二、SpringBoot如何解決跨域
SpringBoot在使用時,可以使用註解進行跨域解決。比如使用@CrossOrigin註解來解決跨域問題。
@CrossOrigin(origins = "*", maxAge = 3600)
@GetMapping("/test")
public String test(){
return "test";
}
代碼解析:
@CrossOrigin註解允許來自所有源的訪問,同時有效期設定為3600秒。
origins參數是一個字符串數組類型,表示允許訪問的源(CORS標準,即Cross-Origin Resource Sharing,中文名為跨源資源共享)。如果使用 * 作為通配符則允許任意源訪問。
maxAge參數表示在指定時間內不需要再發起預檢驗請求(OPTIONS)。
三、全局配置跨域
可以在SpringBoot的Web配置類中進行全局跨域配置。
@Configuration
public class CorsConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
代碼解析:
CorsRegistry是Spring提供的一個對象,可以配置跨域策略。
addMapping方法表示攔截所有路徑。
allowedOrigins方法表示允許的源。
allowedMethods方法表示允許的請求方法。
allowedHeaders方法表示允許的請求頭。
allowCredentials方法表示是否可以將響應頭暴露給前端。
maxAge方法表示有效期時間。
四、攔截器解決跨域
使用攔截器可以在請求到達Controller之前進行跨域的處理。
@Component
public class CorsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
return true;
}
}
代碼解析:
繼承自HandlerInterceptor的CorsInterceptor,實現了preHandle方法,該方法是在請求到達Controller之前進行的操作。
設置響應頭信息Access-Control-Allow-Origin表示允許的源。
設置響應頭信息Access-Control-Allow-Headers表示允許的請求頭。
設置響應頭信息Access-Control-Allow-Credentials表示是否可以將響應頭暴露給前端。
設置響應頭信息Access-Control-Allow-Methods表示允許的請求方法。
設置響應頭信息Access-Control-Max-Age表示有效期時間。
五、使用Filter實現跨域解決
Filter是javax.servlet提供的一個過濾器接口,可以使用Filter來實現對請求進行過濾和響應處理。
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
chain.doFilter(req, res);
}
}
代碼解析:
實現Filter接口,實現doFilter方法進行操作。
HttpServletRequest和HttpServletResponse是javax.servlet提供的請求和響應對象。
設置響應頭信息Access-Control-Allow-Origin表示允許的源。
設置響應頭信息Access-Control-Allow-Headers表示允許的請求頭。
設置響應頭信息Access-Control-Allow-Credentials表示是否可以將響應頭暴露給前端。
設置響應頭信息Access-Control-Allow-Methods表示允許的請求方法。
設置響應頭信息Access-Control-Max-Age表示有效期時間。
六、總結
以上是SpringBoot解決跨域問題的多種方式,開發者可以根據自己的需要選擇合適的解決方案。
原創文章,作者:PLDBF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/333005.html