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 其它问题

最新文章

  1. UVALive 6908---Electric Bike(DP或记录型深搜)
  2. selenium 富文本框处理
  3. [转]net中哈希表的使用 Hashtable
  4. &quot;org.jboss.netty.internal.LoggerConfigurator&quot;.DESCRIBED is already registered 的解决办法
  5. clojure
  6. (三)CSS高级语法
  7. 2014 百度之星题解 1002 - Disk Schedule
  8. Windows Azure 存储管理器 (2014)
  9. Mybatis 构造resultMap 搜sql
  10. HDU 1251 统计拼图 Trie解决问题的方法
  11. 关于使用mybatis的几点总结
  12. LeetCode 542. 01 Matrix
  13. 2. Packet crafting tools (封包工具 6个)
  14. Python设计模式 - UML - 时序图(Sequence Diagram)
  15. c复杂函数指针
  16. Laravel自定义 封装便捷返回Json数据格式引用
  17. Android 源码编译 指定userdata.img、system.img、cache.img容量大小【转】
  18. Java之创建对象&gt;3.Enforce the singleton property with a private constructor or an enum type
  19. Java菜鸟学习笔记(23)--继承篇(二):继承与组合
  20. 13.solr学习速成之IK分词器

热门文章

  1. Lock和synchronized的区别和使用(转发)
  2. PHP支付宝手机网站支付功能
  3. Cookie&amp;Session笔记
  4. Spring基础17——使用注解来配置Bean
  5. 10年前文章_iscsi initiator 设置
  6. strptime strftime时间函数总结
  7. 缓存算法LRU笔记
  8. layui 单选框取消选中
  9. 华为云服务器centos7.3 安装jdk
  10. easyui 无限级数tree[menulist1 = GetMenuList(sm2,menulist1);]