postman测试接口报错401 Unauthorized
问题描述
初学者在运行项目时可能出现的问题,由于项目配置了拦截器,在访问接口时可能会报错 401 Unauthorized
以我自己学习的一个项目为例:
原因分析
由于是一个后台管理系统,配置了用户的登录验证。
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 登录接口和注册接口不拦截
registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//令牌验证
String token = request.getHeader("Authorization");
//验证token
try {
//从redis中获取相同的token
ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
String redisToken = operations.get(token);
if (redisToken==null){
//token已经失效了
throw new RuntimeException();
}
Map<String, Object> claims = JwtUtil.parseToken(token);
//把业务数据存储到ThreadLocal中
ThreadLocalUtil.set(claims);
//放行
return true;
} catch (Exception e) {
//http响应状态码为401
response.setStatus(401);
//不放行
return false;
}
}
这里的代码使得项目只能直接访问登录和注册接口,而其他接口必须要进行认证。此时咱们可以观察一下,这里是通过redis存储token的
解决方法
正是因为有token访问的限制,那我们就去拿到token不就好了
所以直接访问利用已有的账号进行登录,获得token
当然,有些项目中不直接在这里返回token,大家得自己根据项目代码找找token在哪
拿到token就就好办了,直接添加在其他接口访问的header中
这下问题就解决了!赶紧试试吧
这是我自己在跟着学习项目时遇到的一个小问题,不知道大家对这个问题还有什么要补充的,欢迎在评论区交流