记一次跨域问题

        在springboot项目中使用全局异常捕捉后发现一个问题,接口被异常响应后前端出现跨域问题,如果请求正常响应则不会出现。即接口响应码是200,但是前端还是会报跨域的问题。

发现问题

        非常的纳闷,为何正常请求不会有问题,我当时的代码是这样的:

        1.声明了一个全局异常捕捉类,添加注解@RestCntrollerAdvice,增加方法添加注解@ExceptionHandler,捕捉未登录异常AuthenticationException.class

@RestControllerAdvice
public class GlobalErrorController {

    // 未认证或认证失败异常
    @ExceptionHandler( { AuthenticationException.class, BadCredentialsException.class, AccountExpiredException.class} )
    public ResponseEntity authErrorHandler(Exception e) {
        return ResponseEntity.unauthorized(e.getMessage());
    }

}

        2.在过滤器Filter中验证当前请求是否已登录,未登录则抛出异常

HandlerExceptionResolver handlerExceptionResolver = (HandlerExceptionResolver) ApplicationUtil.getBean("handlerExceptionResolver");
handlerExceptionResolver.resolveException(request, hResponse, null,new AccountExpiredException("未登录或登录过期,需重新登录"));
return;

       运行后如上所说,正常的请求不会报跨域,抛出异常后请求响应码是200,但是浏览器还是会报跨域的异常,我已经添加了全局允许跨域,且按照网上的方式,在我的GlobalErrorController中添加了@CrossOrigin注解和@Order(999999),但是还是没效果。

解决问题

       在前端查看请求响应头,发现并未携带跨域配置access-control-allow-headers,于是经过调试,发现如果在过滤器中通过HandlerExceptionResolver抛出的异常没有携带跨域请求头。

        于是在过滤器中添加:

HandlerExceptionResolver handlerExceptionResolver = (HandlerExceptionResolver) ApplicationUtil.getBean("handlerExceptionResolver");
hResponse.setHeader("Access-Control-Allow-Origin", "*");
hResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
hResponse.setHeader("Access-Control-Max-Age", "3600");
hResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with");
handlerExceptionResolver.resolveException(request, hResponse, null,new AccountExpiredException("未登录或登录过期,需重新登录"));

        前端没有出现跨域异常。

你可能感兴趣的:(java,开发语言,前端,跨域)