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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。