后端技术说明 - BISTU-CETC/order_system GitHub Wiki
跨域问题
后端的每一个响应都应该确保包含允许跨域访问的信息。
-
所有controller都应该加上@CrossOrigin跨域注解,它将自动设置响应头,这解决了正常响应的跨域问题。
-
特别注意ExceptionHandler的响应,应该手动设置响应,这解决了异常响应的跨域问题。
-
对于使用非简单http方法的请求,后端还需要处理options预请求,使用拦截器CorsInterceptor设置返回并截断请求(请看下面拦截器)。
拦截器配置
采用4级拦截器(按顺序)
CorsInterceptor
用于拦截并截断所有options请求。
前端使用非简单http方法访问接口时,首先发送试探options请求,后端必须通过响应告诉前端允许跨域以及允许的方法。
对于所有options请求,CorsInterceptor设置响应头并返回false 中断服务器的后续处理。
该拦截器的特点是:会且只会截断所有的options请求。
LogInterceptor
用于打印来访者信息,包括可能的来访者IP,访问方法,访问路径,访问时间等等。
该拦截器一定放行请求。
AuthenticationInterceptor
用于验证来访者信息,主要验证headers中是否携带token,并从token中获取来访者信息。
若token异常,拦截器返回false 中断服务器的后续处理。
AuthorizationInterceptor
用于验证来访者的权限,查询来访者所有权限,并与借口路径比对,成功则放行,否则拦截器返回false 中断服务器的后续处理。
常见问题和解决方案
问题1
描述
有时后端报错,莫名其妙导致AuthenticationInterceptor生效,且检测到token_missing错误。
分析
一个请求可能通过了所有拦截器,但是会在接口处抛出异常,比如请求方式与接口冲突,此时springboot自动转发到/***/error资源,该请求必然再次经过AuthenticationInterceptor拦截器,当然,请求的headers中没有token,所以产生上述错误。
解决方案
在ExceptionHandler中处理上述过程中的错误,将错误以500后端错误的形式通知前端。
注意,在ExceptionHandler处理异常时,应当设置响应通知允许跨域否则前端会认为服务器不允许跨域请求,从而报cors错误,导致后端异常的信息被掩盖。