使用Shiro等安全框架不拦截验证Get方式下的token/Get方式下会拦截验证token问题
前言:这个问题其实挺基础的,但自己还是费了一点时间,特此记录下,在使用Shiro后post拦截和放行都没有问题,唯独在以get方法下载图片等在不需要token验证的方式下一直被拦截
文章目录
-
- 错误示例
- 正确示例(一)
- 正确示例(二)
错误示例
Controller代码
说明:这里是用get拼接路径的方式指定参数,也就是使用@PathVariable注解
@ApiOperation(value = "下载图片接口",notes = "下载图片接口") @RequestMapping(value="/valuePerPhoto2/{fileName}",method = RequestMethod.GET) public void valuePerPhoto2(HttpServletResponse response,@PathVariable(value = "fileName") String fileName){ log.info("fileName:"+fileName); }
Shiro安全框架中对拦截路径的配置部分代码
说明:而在配置拦截路径时只到接口方法名,有经验的人应该看出来这里是有问题的
filterChainMap.put("/download/valuePerPhoto2","anon");/* 下载接口 */
测试结果
断点
说明:在自定义过滤器类中可以明显看到这个接口有被拦截的,token为null是因为我没有传token
正确示例(一)
修改Shiro配置路径,追加/ **
filterChainMap.put("/download/valuePerPhoto2/**","anon");/* 下载接口 */
测试结果
因为下载图片等特定接口要获取到文件后缀名,使用上面@PathVariable注解不好处理,可以切换成@RequestParam注解来获取入参参数
正确示例(二)
修改Controller层代码
@ApiOperation(value = "下载图片接口",notes = "下载图片接口") @RequestMapping(value="/valuePerPhoto2",method = RequestMethod.GET) public void valuePerPhoto2(HttpServletResponse response,@RequestParam(value = "fileName") String fileName){ log.info("fileName:"+fileName); }
修改Shiro拦截路径配置,去掉/ **
filterChainMap.put("/download/valuePerPhoto2","anon");/* 下载接口 */
测试结果
说明:注意这里是传请求参数,get方式下路径后面是?fileName=2222222