SpringBoot整合Shiro 涉及跨域和@Cacheable缓存/@Transactional事务注解失效问题(五)

1. 跨域(多出现在前后端分离项目中)

  (1) 跨域介绍可参考:跨域(CORS)

  (2) SpringBoot中解决跨域方式有:

    A. 使用@CrossOrigin注解;

    B. 实现Filter类,重写doFilter方法

package com.ruhuanxingyun.config;

import cn.hutool.core.util.StrUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "CorsFilter")
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
        response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, OPTIONS, PUT, DELETE");     // 浏览器低版本不支持*
        response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Authorization, Content-Type");
        // 跨域时会发送option请求
        if (StrUtil.equals(request.getMethod(), HttpMethod.OPTIONS.name())) {
            response.setStatus(HttpStatus.OK.value());
        } else {
            chain.doFilter(req, res);
        }
    }

}

    但是SpringBoot整合Shiro后,注解跨域就失效了,原因:shiro的过滤器会在注解跨域处理之前执行,这就导致未允许跨域的请求先到达shiro过滤器,这样就会出现跨域错误

  (3) 在shiro中实现跨域,有以下两种方式

    A. 继承BasicHttpAuthenticationFilter类,重写preHandle方法

/** * 提供跨域支持 * * @param request  请求对象 * @param response 响应对象 * @return 允许跨域 * @throws Exception 异常信息 */@Overrideprotected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {    HttpServletRequest httpServletRequest = (HttpServletRequest) request;    HttpServletResponse httpServletResponse = (HttpServletResponse) response;    httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");    httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, OPTIONS, PUT, DELETE");    // 浏览器低版本不支持*    httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Authorization, Content-Type");    // 跨域时会发送option请求    if (StrUtil.equals(httpServletRequest.getMethod(), HttpMethod.OPTIONS.name())) {        httpServletResponse.setStatus(HttpStatus.OK.value());

        return false;    }

    return super.preHandle(request, response);}

  B. 实现Filter类,重写doFilter方法(如上)

2. @Cacheable缓存/@Transactional事务注解失效

  (1) 问题体现:缓存和事务注解失效的类,都是在shiro框架中(loginRealm、jwtRealm)使用过@Autowired注入的类,而其他service事务都可以正常使用

  (2) 产生原因:在shiro中为了引入权限注解,配置了defaultAdvisorAutoProxyCreator和authorizationAttributeSourceAdvisor类,他们是通过AOP方式对@RequiredPermission类进行增强,生成对应的代理类对象,由于shiroFilterFactoryBean实现了factoryBean接口,所以会被提前初始化,所以引发所有相关的bean提前初始化,导致他们没有被事务AOP包裹着,从而引发事务无效的问题

  (3) 解决方式

    A. @Autowired + @Lazy注解 延时加载注入

    B. 在Realm中直接使用mapper,而不是service

    C. ApplicationContextRegister.getBean()方法,手动注入bean

 

原文地址:https://www.cnblogs.com/ruhuanxingyun/p/12147918.html

时间: 2024-08-06 23:17:15

SpringBoot整合Shiro 涉及跨域和@Cacheable缓存/@Transactional事务注解失效问题(五)的相关文章

springboot+springcache+shiro+Redis整合时@Cacheable、@Transactional等注解失效的问题

问题描述: 1.springboot整合shiro之前@Cacheable.@Transactional等注解都可以正常使用: 2.整合了shiro之后,自定义MyShiroRealm中注入RoleUserService时 RolerUservice中的@Cacheable.@Transaction都失效了. MyShiroRealm代码: RoleUserService代码: 原因:shiro和cache在引用service实例顺序问题,shiro引入应在cache后, shiro配置文件中引

Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限

官网:www.fhadmin.org 特别注意: Springboot 工作流  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0.0+ mybaits+maven+接口 前端页面:html +vue.js 形式 jquery ajax 异步跨域 json 格式数据交互 前后分离,前后台分开部署 (特别注意,前端用的vue.js,  就是html页面引入vue.js形式, 用tomcat部署运行,更适合后台开发者) 工作流模块

SpringBoot系列十二:SpringBoot整合 Shiro

1.概念:SpringBoot 整合 Shiro 2.具体内容 Shiro 是现在最为流行的权限认证开发框架,与它起名的只有最初的 SpringSecurity(这个开发框架非常不好用,但是千万不要 以为 SpringSecurity 没有用处,它在 SpringCloud 阶段将发挥重大的作用).但是现在如果要想整合 Shiro 开发框架有一点很遗憾, SpringBoot 没有直接的配置支持,它不像整合所谓的 Kafka.Redis.DataSource,也就是说如果要想整合 Shiro 开

2019-03-26 SpringBoot项目部署遇到跨域问题,记录一下解决历程

近期SpringBoot项目部署遇到跨域问题,记录一下解决历程. 要严格限制,允许哪些域名访问,在application.properties文件里添加配置,配置名可以自己起: cors.allowed.origin=http://10.xx.253.xx:8081,http://localhost:4200 做前后端分离的时候,这里允许的域名/IP一般都是前端项目所部署的机器. 添加一个配置类.@Configuration和@Bean注解一定要加上的.这样SpringBoot在启动的时候才会扫

SpringBoot整合Shiro 集成Redis缓存(六)

简介:由于考虑到项目后期分布式部署,所以缓存由ehcache改为redis,而redis既有单机版部署,也有分布式部署,所以二者需要兼容. 1. maven依赖 <dependency> <groupId>org.crazycake</groupId> <artifactId>shiro-redis</artifactId> <version>3.1.0</version> </dependency> 2. 设

Springboot vue.js html 跨域 前后分离 shiro权限 集成代码生成器

本代码为 Springboot vue.js  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ mybaits+maven+接口 前端页面:html +vue.js 形式 jquery ajax 异步跨域 json 格式数据交互 前后分离,前后台分开部署 (特别注意,前端用的vue.js,  就是html页面引入vue.js形式, 用tomcat部署运行,更适合后台开发者) 1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)

springboot学习笔记-5 springboot整合shiro

http://www.cnblogs.com/hlhdidi/p/6376457.html 亲自验证,该帖真实有效 shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/  它提供了很方便的权限认证和登录的功能. 而springboot作为一个开源框架,必然提供了和shiro整合的功能!接下来就用springboot结合springmvc,mybatis,整合shiro完成对于用户登录的判定和权限的验证. 1.准备数据库表结构 这里主要涉及到五张表:

前后端分离 springboot整合shiro

实现前后端的跨域,我是在后端配置类里实现 创建配置类 WebMvcConfig import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; //

springboot整合shiro应用

1.Shiro是Apache下的一个开源项目,我们称之为Apache Shiro.它是一个很易用与Java项目的的安全框架,提供了认证.授权.加密.会话管理,与spring Security 一样都是做一个权限的安全框架,但是与Spring Security 相比,在于 Shiro 使用了比较简单易懂易于使用的授权方式.shiro属于轻量级框架,相对于security简单的多,也没有security那么复杂.所以我这里也是简单介绍一下shiro的使用. 2.非常简单:其基本功能点如下图所示: A