最近在整理一个自己以前做过的系统,想要添加一些功能,发现shiro框架出现了点问题,觉得这个错误应该还是蛮有价值的,就写出来和大家分享下…

ShiroRequiresRole注解对于axios请求无效

场景再现

前端发送一个POST请求,而后端对应的接口是有一个RequiresRole注解。

出现的问题:

  1. 前端发送请求发现没有反应,只执行认证代码

  2. 使用接口文档swagger在线测试和Post Man测试这个接口,发现这个@RequiresRole是起作用的,对于没有权限的用户是可以成功拦截的。

  3. 将@RequiresRole注解注释掉,axios请求可以成功进入该接口

解决方案

通过上面的尝试,我们大概可以猜到问题出现的位置大概是shiro框架和axios的问题,于是我们就进行网上的解决方案的查找。

网上的解决方案

**一、**网上的很多解决方案都说是跨域的问题,于是,我们在vue-config中已经配置了跨域请求,但是我们只是本地测试,没有进行跨域,自然不是跨域的问题。

module.exports = defineConfig({
transpileDependencies: true,
devServer: {
host: 'localhost',
port: 8080,
proxy: {
'/api': {
target: 'http://localhost:9527/api',
changeOrigin: true
}
}
}
})

二、 axios在发送请求的时候先发送OPTIONS请求,然后再发送POST,OPTIONS请求status返回200才会正常发起请求,我们需要对OPTION请求进行放行

在我们自定义的Filter对OPTIONS进行放行

@Override
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
httpServletResponse.setStatus(HttpStatus.OK.value());
return false;
}
return super.preHandle(request, response);
}

三、 未携带cookie的问题

在axios的默认配置中,axios.defaults.withCredentials 默认是false,而shiro框架用户认证是需要浏览器cookie存在JSESSIONID信息,发送请求需要携带信息,因此在前后端都需要允许Credentials。

前端

axios.defaults.withCredentials = true

后端

在WebMvcConfig中

@Override
protected void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowCredentials(true);
}

发现请求还是被拦截了,到这里可能就有一点疑问

为什么配置了还是没有成功,然后我在网上又找到一篇博客提到在返回response的请求头上还要Access-Control-Allow-Credentials为true,于是我们修改一下我们自己的BasicHttpAuthenticationFilter,然后惊奇的发现成功了


@Override
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); // 这里
if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
httpServletResponse.setStatus(HttpStatus.OK.value());
return false;
}
return super.preHandle(request, response);
}

如果上面有什么写错的地方,希望各位大神多多指点一下,也希望分享的可以帮助到大家。

shiro拦截axios请求导致@RequireRole注解失效的更多相关文章

  1. 前端快闪四: 拦截axios请求和响应

    马甲哥继续在同程艺龙写一点大前端: 今天我们来了解一下 如何拦截axios请求/响应? axios是一个基于 promise 的网络请求库,可以用于浏览器和 node.js, promise 类似于C ...

  2. 【源码分析】FastJson全局配置日期格式导致@JSONField(format = "yyyy-MM-dd")注解失效

    出现的问题 我全局配置的时间格式是:yyyy-MM-dd HH:mm:ss @JSONField注解配置的时间格式是:yyyy-MM-dd 最终的返回结果是:yyyy-MM-dd HH:mm:ss 问 ...

  3. @Transactional 注解失效场景

    @Transactional可以用在接口.类.类方法上. 作用于类:当把@Transactional注解放在类上时,表示该类的所有public方法都配置了该事物注解. 作用于方法:表示该方法配置了事物 ...

  4. Spring中@Translational注解失效场景

    今天面试被问到@Translational注解什么场景下失效,我一脸懵逼,说的恍恍惚惚的,下来我就总结一下@Translational注解失效的场景! @Transactional 注解相信大家并不陌 ...

  5. @Transaction注解失效的几种场景

    一.@Transactional介绍 1.@Transactional注解可以作用于哪些地方? @Transactional 可以作用在接口.类.类方法上. 作用于类:表示所有该类的public方法都 ...

  6. Spring aop注解失效

    问题 在spring 中使用 @Transactional . @Cacheable 或 自定义 AOP 注解时,对象内部方法中调用该对象的其他使用aop机制的方法会失效. @Transactiona ...

  7. springboot的注解声明过滤器配置错误导致拦截所有请求。

    究其原因, 原来spring 扫包时候 扫了Webfilter 注解,注册了一次过滤匹配路径,扫了Component注解(又注册了一次过滤匹配路径,默认是全路径). Component注解后于WebF ...

  8. vue 路由拦截、axios请求拦截

    路由拦截 项目中,有些页面需要登录后才能进入,例如,在某页面A,用户在操作前需要先进入登录页(此时需要将上一页的地址(/survey/start)作为query存入login页面的地址中,如: htt ...

  9. axios(封装使用、拦截特定请求、判断所有请求加载完毕)

    博客地址:https://ainyi.com/71 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 Node.js 中使用 vue2.0之后,就不再对 vue-resource 更新 ...

  10. token回话保持,axios请求拦截和导航守卫以及token过期处理

    1:了解token:有时候大家又说token令牌.整个机制是前端第一次登陆发送请求,后端会根据前端的用户名和密码, 通过一些列的算法的到一个token令牌, 这个令牌是独一无二的,前端每次发送请求都需 ...

随机推荐

  1. ABP vNext微服务架构详细教程(补充篇)——单层模板

    1. 简介 在之前的<ABP vNext微服务架构详细教程>系列中,我们已经构建了完整的微服务架构实例,但是在开发过程中,我们会发现每个基础服务都包含10个类库,这是给予DDD四层架构下A ...

  2. VS中多字节字符集和UNICODE字符集的使用说明

    两者的核心区别: 1.在制作多国语言软件时,使用Unicode(UTF-16,16bits,两个字节).无特殊要求时,还是使用多字节字符集比较好. 2.如果要兼容C编程,只能使用多字节字符集.这里的兼 ...

  3. K8S多节点部署

    一.k8s多节点部署(接上篇博客) 1.环境准备 服务器 ip 组件 k8s集群master01 192.168.142.3 kube-apiserver.kube-controller-manage ...

  4. C#重点语法——反射

    ------------恢复内容开始------------ 一.含义 反射是指访问,检测或修改程序代码本身状态或行为的一种技术. 举例: 官方代码继承了IReflect ------------恢复 ...

  5. LoadRunner——安装教程以及创建与录制(一)

    theme: channing-cyan 1. loadrunner12|loadrunner12官方版下载(附安装教程)+网盘下载+汉化包 CSDN下载及安装教程: https://blog.csd ...

  6. Android笔记--图形控制

    图形Drawable 形状图形(其定义文件是以shape标签为根节点的XML描述文件,支持四种类型的形状) 具体实现: 在shape标签里面,solid指定填充的颜色,stroke指定边框颜色,cor ...

  7. 对于利用Java Script实现的判断的基础浅层总结

    各种判断,请收好啦! 判断输入框中的数据是否为整数: 点击删除按钮,出现判断是否删除的弹窗 在button里面加上这样一句话就能够实现删除判断弹窗啦!

  8. GRU简介

    一.GRU介绍 GRU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流形的一种网络.GRU既然是LSTM的变体,因此也是可以解决RNN网络中的长依 ...

  9. C#MD5加密的两种方式

    在开发过程当中,我们经常会用到MD5加密,下面介绍MD5加密的两种方式: /// <summary> /// MD5字符串加密 /// </summary> /// <p ...

  10. Django笔记五之字段类型

    这篇笔记介绍字段的类型 Field Type. Django 的model 下的 field 对应的是 MySQL 中的表字段,而我们定义的 field 的类型则对应 MySQL 中的字段类型. 本次 ...