跨域
协议、域名、端口号 有一个不一样就会发生跨域问题,解决方案:
方案1:在请求接口上加
@CrossOrigin
注解,本质是在response里面添加响应头Access-Control-Allow-Origin:*
,可以配个拦截器,在response里面自己添加方案2:实现
implements WebMvcConfigurer
接口,重写addCorsMappings()
方法,全局统一管理@Configuration public class WebMVCConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("http://localhost:8080"); } }
方案3:
nginx
里面配置一下,代理前后端服务,实现请求转发,浏览器只用访问nginx的地址
拦截器
- 自定义拦截器
@Component public class LoginInterceptor implements HandlerInterceptor { @Autowired private LoginService loginService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); SysUser sysUser = loginService.checkToken(token); if (sysUser == null){ Result result = Result.fail(ErrorCode.NO_LOGIN.getCode(), "未登录"); response.setContentType("application/json;charset=utf-8"); response.getWriter().print(JSON.toJSONString(result)); return false; } //是登录状态,放行 return true; } }
- 注册拦截器,实现
implements WebMvcConfigurer
,重写preHandle()
@Configuration public class WebMVCConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns("/test"); } }
- 过滤器与拦截器区别: https://blog.csdn.net/javacollect/article/details/80873686?spm=1001.2101.3001.6650.12&utmmedium=distribute.pcrelevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-12.nosearchlink&depth1-utmsource=distribute.pcrelevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-12.nosearchlink&utmrelevantindex=18