Spring Boot统一功能处理(Spring拦截器)

为什么需要Spring拦截器

原生的Spring AOP实现统一拦截有两大难点,1.定义拦截的规则难写;2.在切面类中拿到HttpSession比较难。为此Spring官方提供了拦截器帮我们解决了上面痛点。

实现登入信息验证拦截器

  1. 实现HanderInterceptor接口
  2. 重写preHeadler方法,在方法中编写自己的业务代码
java 复制代码
//验证登入信息的拦截器
public class LoginInterceptor implements HandlerInterceptor {
    //此方法返回一个boolean,如果为true表示验证成功,继续执行后续流程
    //如果是false表示验证失败,后面流程不能执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if(session != null && session.getAttribute("userinfo") != null) {
            return true;
        }
        //身份验证失败,重定向到登入页面
        response.sendRedirect("/login.html");
        return false;
    }
}
将拦截器添加到配置文件中,并且设置拦截规则
java 复制代码
@Configuration
public class AppConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")  //**表示拦截所有请求
                .excludePathPatterns("/user/login") //不拦截的url地址
                .excludePathPatterns("/user/reg")
                .excludePathPatterns("/login.html");//登入页面不拦截,否则会报重定向多次的错误
    }
}
拦截器实现原理


Spring中的拦截器是通过动态代理和环绕通知的思想实现的

给当前项目配置统一的前缀

之所以要配置统一的前缀是因为在一个服务器中有多个程序,却只有一个域名,就需要在每个程序添加url前缀才知道访问哪个程序

  1. 在系统的配置文件中配置
java 复制代码
@Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("/zhangsan",  c ->true);//设置true启动前缀
    }
  1. 在application.properies配置
java 复制代码
server.servlet.context-path=/lisi

统一异常处理

创建一个类,并在类上标识 @ControllerAdvice
java 复制代码
@ControllerAdvice
@ResponseBody
public class MyExhandler {
}
添加方法@ExeceptionHandler来订阅异常
java 复制代码
/*
    拦截所有空指针异常
     */
    @ExceptionHandler(NullPointerException.class)
    public HashMap<String, Object> nullException(NullPointerException e) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("code", -1);
        result.put("msg", "空指针异常:" + e.getMessage());
        result.put("data", null);
        return result;
    }
    @ExceptionHandler(Exception.class)
    public HashMap<String, Object> exception(Exception e) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("code", -1);
        result.put("msg", "异常:" + e.getMessage());
        result.put("data", null);
        return result;
    }

统一数据格式返回

  1. 创建一个类,并添加@ControllerAdvice
  2. 实现ResponseBodyAdvice接口,并重写supports和beforeBodyWrite
java 复制代码
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    @Autowired
    private ObjectMapper objectMapper;
    /*
    返回true则执行beforeBodyWrite方法,反之不执行
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("msg", "");
        result.put("data", body);
        //body是String时转换时会报错,需要特殊处理
        if(body instanceof String) {
            try {
                return objectMapper.writeValueAsString(result);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}
相关推荐
程序猿DD43 分钟前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i3 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8264 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林5 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne6 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF6 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li6 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala7 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna7 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈7 小时前
因为太想讨好你,所以AI会骗你
后端