您好,登錄后才能下訂單哦!
springboot中怎么解決跨域問題,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
第一種:是在每個Controller里,加上注解:@CrossOrigin
import javax.validation.Valid; @CrossOrigin @RestController @RequestMapping("/user") public class UserController{
也可以在方法上加上,比如這樣,這樣針對具體的方法
@CrossOrigin @ApiOperation(value = "用戶登錄",notes = "") @PostMapping("/loginOn") public ResponseMessage loginOn(@RequestBody @Valid UserReq userReq){
每一個Controller這樣寫也是很麻煩。
第二種:是實現WebMvcConfigurer接口,在接口中進行跨域支持
以前可以繼承WebMvcConfigurerAdapter,springboot2.x版本已經將其@Deprecated
我們直接實現接口:
@Configuration public class WebConfig implements WebMvcConfigurer { /** * 跨域支持 * @param registry */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "DELETE", "PUT") .maxAge(3600 * 24); }
但使用這種方法,我今天遇到一個坑,我準備在攔截器里面對用戶的請求進行攔截
@Component public class RequestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object loginUser = request.getSession().getAttribute("token"); if(loginUser == null){ //自定義的異常類,這里拋出異常,交給全局異常捕捉類處理 throw new ServiceException("沒有權限,請先登錄!"); }else{ return true; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
全局異常捕捉類:
@RestControllerAdvice public class GlobleExceptionHandler { @ExceptionHandler(value = ServiceException.class) public ResponseMessage caughtException(ServiceException e){ return new ResponseMessage(e.getMsg()); } }
ResponseMessage 是自定義的統一的響應信息類:
ResponseMessage
@Data public class ResponseMessage { private Integer Code; private String msg; private Integer count; private Object data; public ResponseMessage(Object data) { this.data = data; } public ResponseMessage(String msg) { this.msg = msg; } public ResponseMessage(Integer code, String msg) { Code = code; this.msg = msg; } public ResponseMessage(Integer code, String msg, Integer count) { Code = code; this.msg = msg; this.count = count; } public ResponseMessage(Integer code, String msg, Integer count, Object data) { Code = code; this.msg = msg; this.count = count; this.data = data; } public static ResponseMessage success(String msg){ return new ResponseMessage(200,msg); } public static ResponseMessage fail(Integer code,String msg){ return new ResponseMessage(code,msg); } }
通過這樣的處理發現,前端一直報跨域異常問題,這時候有了第三種方法
第三種:使用CorsFilter過濾器:
寫一個MyCorsConfig 配置類
@Configuration public class MyCorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); corsConfiguration.setMaxAge(3600L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfiguration); FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); //設置過濾器的順序 bean.setOrder(0); return new CorsFilter(source); } }
看完上述內容,你們掌握springboot中怎么解決跨域問題的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。