springboot配置允許跨域請求


1、處理個別controller,在controller上使用@CrossOrigin注解即可

@RestController
@RequestMapping("/api")
public class SysController {
@CrossOrigin
@GetMapping("/systime")
public ApiResult sysTime() {
 try {
List<SysTimeVO> sysTimeVOList = sysService.querySysTime();
return new ApiResult()
.setSuccess(true)
......

2、全局配置,配置WebMvcConfigurer

@Configuration
public class WebConfig implements WebMvcConfigurer {

// 設置允許跨域請求

@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry
.addMapping("/**")
// .allowedOrigins("http://yyy.com", "http://xxx.com") //
// 允許跨域的域名
.allowedOriginPatterns("*") // 允許所有域
.allowedMethods("*") // 允許任何方法(post、get等)
.allowedHeaders("*") // 允許任何請求頭
.allowCredentials(true) // 允許證書、cookie
.exposedHeaders(HttpHeaders.SET_COOKIE)
.maxAge(3600L); // maxAge(3600)表明在3600秒內,不需要再發送預檢驗請求,可以緩存該結果
}
};
}
}

 3、測試

瀏覽器打開百度,F12調試模式,在console中粘貼如下js代碼回車:

var token= "LtSFVqKxvpS1nPARxS2lpUs2Q2IpGstidMrS8zMhNV3rT7RKnhLN6d2FFirkVEzVIeexgEHgI/PtnynGqjZlyGkJa4+zYIXxtDMoK/N+AB6wtsskYXereH3AR8kWErwIRvx+UOFveH3dgmdw1347SYjbL/ilGKX5xkoZCbfb1f0=,LZkg22zbNsUoHAgAUapeBn541X5OHUK7rLVNHsHWDM/BA4DCIP1f/3Bnu4GAElQU6cds/0fg9Li5cSPHe8pyhr1Ii/TNcUYxqHMf9bHyD6ugwOFTfvlmtp6RDopVrpG24RSjJbWy2kUOOjjk5uv6FUTmbrSTVoBEzAXYKZMM2m4=,R4QeD2psvrTr8tkBTjnnfUBw+YR4di+GToGjWYeR7qZk9hldUVLlZUsEEPWjtBpz+UURVmplIn5WM9Ge29ft5aS4oKDdPlIH8kWNIs9Y3r9TgH3MnSUTGrgayaNniY9Ji5wNZiZ9cE2CFzlxoyuZxOcSVfOxUw70ty0ukLVM/78=";
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:8080/api/systime');
xhr.setRequestHeader("x-access-token",token);
xhr.send(null);
xhr.onload = function(e) {
var xhr = e.target;
console.log(xhr.responseText);
}

不出現跨域錯誤即可。

4、配置有自定義攔截器時,在攔截器中獲取session校驗登錄操作時,在攔截器preHandle方法一開始加入:

public class SessionInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {

if ("OPTIONS".equals(request.getMethod().toUpperCase())) {
return true;
}

Object obj = request.getSession().getAttribute("customer");
.......

CROS復雜請求時會首先發送一個OPTIONS請求做嗅探,來測試服務器是否支持本次請求,請求成功后才會發送真實的請求;而OPTIONS請求不會攜帶任何數據,導致這個請求不符合我們攔截器的校驗規則被攔截了,直接返回了狀態碼,響應頭中也沒攜帶解決跨域需要的頭部信息,進而出現了跨域問題,所以在攔截器中添加options請求處理,遇到options請求全部放行。

前端jquery ajax跨域訪問:

$.ajax({
        type: "get",
        url: "http://xxxx.com/apiUser/currentUser",
        data: "",
        dataType: "json",
        xhrFields:{
               withCredentials:true
        }
});

jquery ajax跨域訪問是簡單請求,不會做嗅探操作,所以加入withCredentials:true 跨域請求即可,攔截器中的針對options請求的處理針對axios等的嗅探操作。

參考資料:https://blog.csdn.net/MrKorbin/article/details/104066979

5、攔截器返回false會引起跨域問題,解決方法是在返回false前添加如下代碼:

......
PrintWriter writer = null;
try {
writer = response.getWriter();
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
response.addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
response.addHeader("Access-Control-Max-Age", "3600");
writer.print(json);
} catch (IOException e) {

} finally {
if (writer != null) writer.close();
}
}
return false;
......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM