前后端分离项目中后台集成shiro需要注意的二三事
1. 修改 Shiro 认证失败后默认重定向处理问题
a. 继承需要使用的 ShiroFilter,重载 onAccessDenied() 方法:
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
Response result = Response.SUCCESS;
result.setCode(EReturnCode.UNAUTHENTICATED.code());
result.setMsg(EReturnCode.UNAUTHENTICATED.message());
Gson gson = new Gson();
String json = gson.toJson(result);
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.getWriter().write(json); return false;
}
b. 在 Shiro 配置类中使用自定义配置:
/*
* 1.定义ShiroFilterFactoryBean
*/
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 2.注册SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 3.配置拦截器
Map<String, Filter> filterMap = new LinkedHashMap();
// 配置user拦截
filterMap.put("user", new ShiroUserFilter());
// 配置authc拦截
filterMap.put("authc", new ShiroAuthenticationFilter());
shiroFilterFactoryBean.setFilters(filterMap);
2. 跨域及 cookie 丢失问题
a. 前端创建 axios 实例时添加配置:
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_BACKGROUND, // url = base url + request url
withCredentials: true, // send cookies when cross-domain requests
crossDomain: true,
timeout: 5000 // request timeout
})
b. 后端配置 CorsFilter 过滤器处理跨域问题,添加如下配置并把过滤器优先级调高:
/**
* 为response设置header,实现跨域
*
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse; // 指定本次预检请求的有效期,单位为秒
response.setHeader("Access-Control-Max-Age", "1800");
// 防止乱码,适用于传输JSON数据
response.setHeader("Content-Type","application/json;charset=UTF-8");
// 跨域的header设置
String method = request.getMethod();
response.setHeader("Access-Control-Allow-Methods", method);
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers")); // 在访问过来的时候检测是否为OPTIONS请求,如果是就直接返回true(解决cookie丢失问题)
if ("OPTIONS".equalsIgnoreCase(method)) {
servletResponse.getOutputStream().write("Success".getBytes("utf-8"));
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
参考文章:
https://www.cnblogs.com/chinaifae/p/10189312.html Access-Control-Max-Age 和 OPTION请求
https://blog.csdn.net/madonghyu/article/details/80027387 OPTION导致cookie丢失
https://blog.csdn.net/fifteen718/article/details/81127782 前后端分离传递cookie配置
https://blog.csdn.net/yao_1996/article/details/83510474 前后端分离传递sessionId
https://segmentfault.com/q/1010000019774772 其它问题
前后端分离项目中后台集成shiro需要注意的二三事的更多相关文章
- 分享我在前后端分离项目中Gitlab-CI的经验
长话短说,今天分享我为前后端分离项目搭建Gitlab CI/CD流程的一些额外经验. Before Gitlab-ci是Gitlab提供的CI/CD特性,结合Gitlab简单友好的配置界面,能愉悦的在 ...
- Spring-Gateway与Spring-Security在前后端分离项目中的实践
前言 网上貌似webflux这一套的SpringSecurity操作资料貌似很少. 自己研究了一波,记录下来做一点备忘,如果能帮到也在迷惑的人一点点,就更好了. 新项目是前后端分离的项目,前台vue, ...
- 在前后端分离项目中使用SpringBoot集成Shiro
前言 这次在处理一个小项目时用到了前后端分离,服务端使用springboot2.x.权限验证使用了Shiro.前后端分离首先需要解决的是跨域问题,POST接口跨域时会预发送一个OPTIONS请求,浏览 ...
- 《论vue在前后端分离项目中的实践之年终总结》
我是2014年的时候开始了解知道的vue,当时vue还不太成熟,想用但是又怕自己hold不住,况且那时候vue还没有成熟的(路由.验证.ui组件)插件,社区也是不温不火的,再说也没有合适的机遇让我去项 ...
- 08 Django REST Framework 解决前后端分离项目中的跨域问题
01-安装模块 pip install django-cors-headers 02-添加到INSTALL_APPS中 INSTALLED_APPS = ( ... 'corsheaders', .. ...
- Aspnet Mvc 前后端分离项目手记(二)关于token认证
在前后端分离的项目中,首先我们要解决的问题就是身份认证 以往的时候,我们使用cookie+session,或者只用cookie来保持会话. 一,先来复习一下cookie和session 首先我们来复习 ...
- 超简单!asp.net core前后端分离项目使用gitlab-ci持续集成到IIS
现在好多使用gitlab-ci的持续集成的教程,大部分都是发布到linux系统上的,但是目前还是有很大一部分企业使用的都是windows系统使用IIS在部署.NET应用程序.这里写一下如何使用gitl ...
- 基于Vue的前后端分离项目实践
一.为什么需要前后端分离 1.1什么是前后端分离 前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...
- 八个开源的 Spring Boot 前后端分离项目,一定要收藏!
八个开源的 Spring Boot 前后端分离项目 最近前后端分离已经在慢慢走进各公司的技术栈,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,我们也非常建议大家学习一下前 ...
随机推荐
- 批处理遍历文件夹执行git pull
echo off & color 0A for /d %%f in (D:\www\*) do ( D: cd %%f chdir git pull ) pause 遍历D:\www\这个文件 ...
- CTS2018+1没去记&APIO2018+1游记
bgm Tips:想知道为什么标题不是2019吗,请看评论区 Day -2 md上午才写一道题qwq 机房里一堆dalao都回家收东西去北京了qwq,我菜死了,cts都去不了QAQ 下午晚上也才肝了两 ...
- 前端开发HTML&css入门——HTML
HTML究竟为何物?其实HTML就是一种标记语言,英文全称为Hypertext Markup Language,翻译过来就叫超文本标记语言.它的作用就是负责负责网页的三个要素之中的结构. HTML使用 ...
- 混合加密算法(RSA和DES)
一.混合加密的理由 a.前面提及了RSA加解密算法和DES加解密算法这两种加解密算法,由于随着计算机系统能力的不断发展,DES的安全性比它刚出现时会弱得多,追溯历史破解DES的案例层出不穷,一台实际的 ...
- JSP页面包含其他页面的三种方式及区别
一. <%@ include file="header.inc"%> 该指令在编译之前先读入指定的页面中的内容(并不对动态内容求值),融合后的完整页面再被整体的转换为一 ...
- Centos6.6安装MySQL5.6.24
1.首先需要编译器gcc 编译器和cmake yum -y install gcc+ gcc-c++ cd /usr/local/src wget http://www.cmake.org/files ...
- Tomcat报java.io.IOException: Broken pipe错误
Tomcat报java.io.IOException: Broken pipe错误,如下图: 解决方案:我的原因是因为网络策略导致出现该问题,即网络端口未启用或被限制.
- verilog中的timescale
`timescale是Verilog HDL 中的一种时间尺度预编译指令,它用来定义模块的仿真 时的时间单位和时间精度.格式如下: `timescale 仿真时间单位/时间精度 注意:,不能为其它的 ...
- u-boot makefile $$
define filechk_uboot.release echo "$(UBOOTVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setl ...
- 左半连接left demi-join
返回左边表的记录,前提是其记录对于右边表满足on语句的判定条件 对于左表中一条指定的记录,在右表中一旦找到匹配的记录,hive就会立即停止扫描 1.sql select s.myd,s,symbol, ...