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需要注意的二三事的更多相关文章

  1. 分享我在前后端分离项目中Gitlab-CI的经验

    长话短说,今天分享我为前后端分离项目搭建Gitlab CI/CD流程的一些额外经验. Before Gitlab-ci是Gitlab提供的CI/CD特性,结合Gitlab简单友好的配置界面,能愉悦的在 ...

  2. Spring-Gateway与Spring-Security在前后端分离项目中的实践

    前言 网上貌似webflux这一套的SpringSecurity操作资料貌似很少. 自己研究了一波,记录下来做一点备忘,如果能帮到也在迷惑的人一点点,就更好了. 新项目是前后端分离的项目,前台vue, ...

  3. 在前后端分离项目中使用SpringBoot集成Shiro

    前言 这次在处理一个小项目时用到了前后端分离,服务端使用springboot2.x.权限验证使用了Shiro.前后端分离首先需要解决的是跨域问题,POST接口跨域时会预发送一个OPTIONS请求,浏览 ...

  4. 《论vue在前后端分离项目中的实践之年终总结》

    我是2014年的时候开始了解知道的vue,当时vue还不太成熟,想用但是又怕自己hold不住,况且那时候vue还没有成熟的(路由.验证.ui组件)插件,社区也是不温不火的,再说也没有合适的机遇让我去项 ...

  5. 08 Django REST Framework 解决前后端分离项目中的跨域问题

    01-安装模块 pip install django-cors-headers 02-添加到INSTALL_APPS中 INSTALLED_APPS = ( ... 'corsheaders', .. ...

  6. Aspnet Mvc 前后端分离项目手记(二)关于token认证

    在前后端分离的项目中,首先我们要解决的问题就是身份认证 以往的时候,我们使用cookie+session,或者只用cookie来保持会话. 一,先来复习一下cookie和session 首先我们来复习 ...

  7. 超简单!asp.net core前后端分离项目使用gitlab-ci持续集成到IIS

    现在好多使用gitlab-ci的持续集成的教程,大部分都是发布到linux系统上的,但是目前还是有很大一部分企业使用的都是windows系统使用IIS在部署.NET应用程序.这里写一下如何使用gitl ...

  8. 基于Vue的前后端分离项目实践

    一.为什么需要前后端分离 1.1什么是前后端分离  前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...

  9. 八个开源的 Spring Boot 前后端分离项目,一定要收藏!

    八个开源的 Spring Boot 前后端分离项目 最近前后端分离已经在慢慢走进各公司的技术栈,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,我们也非常建议大家学习一下前 ...

随机推荐

  1. 洛谷 - P3803 -【模板】多项式乘法(FFT) - NTT

    https://www.luogu.org/problemnew/show/P3803 看别人偏偏就是要用NTT去过.实验证明大概是这样用.求0~n的多项式和0~m的多项式的乘积.注意MAXN取值.A ...

  2. LeetCode 235. 二叉搜索树的最近公共祖先

    235. 二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先 ...

  3. javascript百度地图使用(根据地名定位、根据经纬度定位)

    需要购买阿里云产品和服务的,点击此链接领取优惠券红包,优惠购买哦,领取后一个月内有效: https://promotion.aliyun.com/ntms/yunparter/invite.html? ...

  4. 剑指offer-二叉树的镜像-python

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  5. JDK集合框架源码分析 - 简单概要

    1.类继承体系 在集合框架的类继承体系中,最顶层有两个接口Collection.Map: Collection 表示一组纯数据 Map 表示一组key-value对 Collection的类继承体系: ...

  6. 基于ELK进行邮箱访问日志的分析

    公司希望能够搭建自己的日志分析系统.现在基于ELK的技术分析日志的公司越来越多,在此也记录一下我利用ELK搭建的日志分析系统. 系统搭建 系统主要是基于elasticsearch+logstash+f ...

  7. react面试题——理解setState(源码object.assign)

    setState是异步的方式 this.setState({     counter:this.state.counter+1 }) console.log(this.state.counter) s ...

  8. mac 命令行终端 设置代理

    环境: macOS Mojave 10.14.3 iTrem 2 3.2.8 酸酸乳1.1.4.4-R8 查看自己命令行的状态 curl ip.gs 正式开始 一.首先检查自己的酸酸乳是否正常,并在高 ...

  9. Apache 用户认证

    基本认证(Basic) 摘要认证(Digest) 更安全 创建一个名为 users 的认证口令: htpasswd    -c   /usr/local/apache2/conf/users sam ...

  10. apachectl 命令详解-graceful 不中断原有连接,重新启动 Apache 服务器

    apachectl(Apache control interface) 参         数: fullstatus     显示服务器完整的状态信息. graceful     重新启动 Apac ...