今天在完成前后端分离项目的token验证时出现了一些小问题,让我们来看一看。
如何生成token我们就不说了,网上有很多教程,一般选择的依赖包二选一:jjwt或者是java-jwt,前者轻量级,后者功能更多更加复杂。
在生成token,我们需要将其放入到响应头中,我们需要在controller方法中加入参数:
HttpServletResponse response,这个参数是由springboot帮我们注入的,然后我们使用
response.addHeader("Authorization",token),向头中添加一个字段,前面是这个字段的名字,这个名字可以随便起,但是约定俗成是这个名字。然后前端使用axios拦截器来拦截并取出头中的信息,如下:
axiosInstance.interceptors.response.use(
response => {
const token = response.headers['Authorization']
if(token){
localStorage.setItem('token',token)
}
return response;
},
error => {
return Promise.reject(error)
}
)
但是经过我的测试,发现响应中读取不到我放入的Authorization属性,然后经过查阅发现,前端程序只能够读取允许的几个属性,自己添加的也不在内,所以我们需要在后端controller中添加一个语句:
response.setHeader("Access-Control-Expose-Headers","Authorization");
第一个参数是固定的关键词,第二个参数表示你想要前端读取到的属性。
设置成功之后,这下应该可以了吧,但是我发现虽然能够读取了,但是仍然读取不到,然后我看了一下,我设置的响应头中的属性是:Authorization,但是它自动改成:authorization,然后我将上面用于接收的大写改成了小写,终于能够正常接收了。