摘要

最近在学习Vue+Springboot,目的是做一个数据处理工具,并且为将来学习Spring Cloud打个基础。这里记录一下开发过程中遇到的坑,持续更新中 ……

一、开发环境

开发环境或者说架构如图。首先Vue和Springboot是放在两个不同的工程里研发的,传说中的前后端分离。调试时可以分开调试,前端用Chrome调试,在Vue的data return里造好数据就行;而后端通过Postman调试Api接口及数据库。

二、跨域问题

上述架构中遇到的第一个问题就是前后端分离的问题,在上面的图中很清楚的看到,Vue在8080端口,而Springboot在8082端口,所以当Vue发送Rest消息给服务端时,会发生跨域。跨域问题有很多解决方面,我用过两种方式:

第一种,Vue的config/prod.env.js和dev.env.js中配置如下,还是从8080端口将消息发往8082端口,如图

然后在服务端增加以下代码:

尝试登入界面,发现Login消息的交互已经正常了

但这种方法得修改服务端代码,而且每个接口都得改,所以比较繁琐,所以推荐第二张方式。

第二种,通过Vue的转发来解决跨域。先删除服务端增加的代码,同时将prod.env.js和dev.env.js的API_ROOT参数去掉,并在conf/index.js中增加转发配置

尝试登入界面,发现Login消息的交互和之前不一样,发送接口变成了8080,所以也就没有跨域问题了。

三、AccessDeniedHandler无法被调用

碰到的第二个问题是AccessDeniedHandler无法被调用,这个问题的来源于重启后端服务后,发现在前端点击任意连接,都会重定向到localhost:8082/login_p。之后尝试在AccessDecisionManager中抛出AccessDeniedException异常,并在AccessDeniedHandler加入Response消息中加上错误原因,但AccessDeniedHandler一直无法捕获到AccessDeniedException异常,在这篇文章Spring security AccessDeniedHandler 不被调用中大概明白了原因,总之如果authentication是anonymous的场景,在ExceptionTranslationFilter会被直接重定向到login。

所以当前的做法是在Vue的res中判断,如果是401错误,则打印错误,并清掉Cookies,最后router push到/login页面。