登陆1-关于sofaboot拦截器的问题

我的问题:一个sofaboot项目中,按正常springboot项目那样写拦截器或者过滤器都不好用

我的写法

@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //每一个项目对于登陆的实现逻辑都有所区别,我这里使用最简单的Session提取User来验证登陆。
        //如果session中没有user,表示没登陆
        log.info("");
        return true;
    }

}

@Configuration
public class WebConfigurer implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns("/**") 表示拦截所有的请求,
        // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
        registry.addInterceptor(loginInterceptor).addPathPatterns("/service/00000/*").excludePathPatterns("/login", "/register");
    }
}

 我访问的路径

http://127.0.0.1:12100/m-pf-productfactory/service/00000/37000008

不管addPathPatterns后边是什么路径是一个*还是两个*都试过

filter也试过  都不好使

没办法用切面写的

如下

@Aspect
@Configuration
@Slf4j
@Component
@Order(1)
public class LoginAspect {
    // 第一个*代表返回类型不限
    // 第二个*代表所有类
    // 第三个*代表所有方法
    // (..) 代表参数不限
    @Pointcut("execution(public * com.wish.biz.pf.productfactory.srv.c04320.*.*(..)) && !execution(public * com.wish.biz.pf.productfactory.srv.c04320.Srv37000048.*(..))")
    //Srv37000048为登陆类
    public void pointCut(){};

    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            if(false){//根据业务逻辑改 可以改成true测试
                throw new BizRuntimeException(MpfProductfactoryErrCodeBussCheck.ERR_CODE_BUSS_CHECK_PF_000007,"1111111");
            }else {
                return proceedingJoinPoint.proceed();
            }
    }
}

如上切面方法,有三点可以学习的地方

1.排除除某个类之外的拦截

& !execution

 @Pointcut("execution(public * com.wish.biz.pf.productfactory.srv.c04320.*.*(..)) && !execution(public * com.wish.biz.pf.productfactory.srv.c04320.Srv37000048.*(..))")

2.  @Before和@Around

之前用@Before   启动报错

ProceedingJoinPoint is only supported for around advice

 而且JointPoint没有proceed方法

3.切面排序

之前没设置排序,导致我想获取的东西被其他优先级更好的切面拦截了

所以   用注解@Order

4.全局异常

发现一个拦截方法  有时间可以试一试有没有用

@ControllerAdvice拦截所有请求

@ExceptionHandler异常拦截

@ControllerAdvice 配合 @ExceptionHandler 实现全局异常处理

在使用`mybatis-spring-boot-starter:2.0.1`时,如果遇到拦截器不生效的问题,可能是由于几个常见的原因造成的。下面是一些可能导致拦截器不生效的原因以及解决方法: 1. **拦截器配置未生效**: 确保你已经在Spring Boot的配置文件中或者使用Java配置类正确配置了拦截器。如果你是通过配置类配置的,确保使用了`@Configuration`注解,并且拦截器的注册方法使用了`@Bean`注解。 2. **拦截器未正确注册**: 在配置类中注册拦截器时,需要使用`Interceptor`接口的实现类,然后通过`InterceptorRegistry`的`addInterceptor`方法将拦截器加入到拦截器链中。 3. **SQL会话(SqlSession)未正确获取**: 如果你的拦截器逻辑依赖于`SqlSession`,确保在拦截器执行过程中正确获取`SqlSession`。通常情况下,`SqlSession`是由MyBatis框架在执行SQL时自动管理的。 4. **拦截器链执行顺序问题**: 如果有多个拦截器,它们将按照注册的顺序执行。如果一个拦截器依赖于另一个拦截器的逻辑,需要确保它们的执行顺序是正确的。 5. **拦截器本身的逻辑问题**: 检查拦截器的实现逻辑是否正确,比如在`intercept`方法中的操作是否会导致后续流程中断,或者是否有其他逻辑错误导致拦截器无法按预期工作。 6. **Spring Boot应用的扫描路径问题**: 确保你的拦截器类位于Spring Boot的组件扫描路径下,这样Spring容器才能发现并管理它。 7. **拦截器版本兼容问题**: 如果你是在升级后遇到了问题,可能是因为新版本中存在某些变更,需要检查升级说明或者相关的迁移指南,以确保所有配置都是兼容的。 解决这类问题通常需要逐一排查上述可能的原因,调试和检查配置代码,确保每一步都按照预期工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值