SpringBoot统一功能处理示例详解(拦截器)

 更新时间:2023年08月05日 16:09:59   作者:白杨783  
这篇文章主要介绍了SpringBoot统一功能处理(拦截器),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1.用户登录权限校验

1.1自定义拦截器

写一个类去实现HandlerInterceptor接口表示当前类是一个拦截器,再重写HandlerInterceptor接口中的方法,preHandle为在方法执行前拦截,postHandle为方法执行中拦截,afterCompletion为方法执行中拦截.需要在什么时候拦截就重写什么方法

@Component
public class LoginIntercepetor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断用户登录
        HttpSession session = request.getSession(false);
        if(session!=null && session.getAttribute(ApplicationVariable.SESSION_USERINFO_KEY)!=null){
            // 用户已经登录
            return true;
        }
        // 当代码执行到此处说明用户未登录
        response.sendRedirect("/login.html");
        return false;
    }
}

1.2.配置拦截规则

@Configuration
public class MyConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**") //拦截所有的URL
                .excludePathPatterns("/user/login") // 排除 url /user/login 不拦截
                .excludePathPatterns("/user/reg") // 排除 url /user/login 不拦截
        ;
    }
}

实现WebMvcConfigurer接口,重写WebMvcConfigurer中的addInterceptors方法,在使用 InterceptorRegistry参数 配置拦截规则

拦截器实现原理

统一异常处理

创建异常处理类

@ControllerAdvice
@ResponseBody
public class MyExceptionAdvice {
}

ControllerAdvice注解的作用:1.和Controller注解作用一样,让这个类随着Spring的启动而启动. 2.监测添加了Controller注解的类的异常 

创建异常检测的类和处理业务

@ExceptionHandler(NullPointerException.class)
public HashMap<String,Object> dpNullPointerException(NullPointerException e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",-1);
        result.put("msg","空指针: "+e.getMessage());
        result.put("data",null);
        return result;
        }

使用@ExceptionHandler注解,括号里面写要捕获的异常,用HashMap的方式返回数据给前端,此处以捕获空指针异常为例,如果想要捕获所有的异常,可以使用所有异常的父类Exception

@ExceptionHandler(Exception.class)
    public HashMap<String,Object> doException(Exception e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",-1);
        result.put("msg","Exception: "+e.getMessage());
        result.put("data",null);
        return result;
    }

统一数据格式返回(在返回数据之前进行数据重写)

@ControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice {
    @Autowired
    ObjectMapper objectMapper;
    /**
     * 是否执行 beforeBodyWrite 方法,true=执行 重写返回结果,false=不执行
     *
     * @param returnType
     * @param converterType
     * @return
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }
    /**
     * 在返回数据之前进行数据重写
     *
     * @param body     原始返回值
     * @param returnType
     * @param selectedContentType
     * @param selectedConverterType
     * @param request
     * @param response
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //定义一个标准的返回格式
        //Hash<String,Object> code,msg,data
        if(body instanceof HashMap){
            return body;
        }
        // 重写返回结果,让其返回一个统一的数据格式
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",200);
        result.put("msg","");
        result.put("data",body);
        if(body instanceof String){
            // 返回一个 String 字符串
            try {
                objectMapper.writeValueAsString(result);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return result;
        }
        return result;
    }
}

使用ResponseBodyAdvice接口,重写supports和beforeBodyWrite方法,这种方式如果原方法返回的是字符串,不进行特殊处理会报错(执行流程:

1.方法返回的是 String

2.统一数据返回之前处理 把String 转换成 HashMap

3.将 HashMap 转换成 application/json 字符串给前端(接口)),在第三步的时候会判断原 body 类型,根据类型选择不同的 消息转换器 去转换,如果是String 类型会使用StringHttpMessageConverter进行类型转换,如果非String 类型,会使用 HttpMessageConverter 进行类型转换.但是事实上StringHttpMessageConverter 消息转换器不能把HashMap转换为json格式的字符串,因此会报错.   我们可以在统一数据重写时,单独处理String类型,让其返回一个 String 字符串,而非HashMap

到此这篇关于SpringBoot统一功能处理(拦截器)的文章就介绍到这了,更多相关SpringBoot统一功能处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合HikariCP数据库连接池方式

    SpringBoot整合HikariCP数据库连接池方式

    这篇文章主要介绍了SpringBoot整合HikariCP数据库连接池方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Mybatis中注解@MapKey的使用详解

    Mybatis中注解@MapKey的使用详解

    mybatis的原身是ibatis,现在已经脱离了apache基金会。这篇文章主要介绍了Mybatis中注解@MapKey的使用的相关资料,需要的朋友可以参考下
    2016-10-10
  • 实例讲解使用Spring通过JPA连接到Db2

    实例讲解使用Spring通过JPA连接到Db2

    这篇文章主要介绍了通过实例讲解使用Spring通过JPA连接到Db2,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习一下吧
    2019-06-06
  • SpringBoot统一接口返回及全局异常处理高级用法

    SpringBoot统一接口返回及全局异常处理高级用法

    这篇文章主要为大家介绍了SpringBoot统一接口返回及全局异常处理高级用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • SpringBoot读取yaml文件操作详解

    SpringBoot读取yaml文件操作详解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • java判断String类型是否能转换为int的方法

    java判断String类型是否能转换为int的方法

    今天小编就为大家分享一篇java判断String类型是否能转换为int的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • JavaWeb之Filter过滤器详解

    JavaWeb之Filter过滤器详解

    本篇文章主要介绍了JavaWeb之Filter过滤器详解,实例分析了JavaWeb之Filter过滤器的使用技巧,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • Java 中的类和对象详情

    Java 中的类和对象详情

    这篇文章主要介绍了Java 中的类和对象,类可以看成是创建Java对象的模板,下面文章围绕着Java 类与对象详细内容展开,需要的朋友可以参考一下
    2021-11-11
  • Spring Boot接口限流的常用算法及特点

    Spring Boot接口限流的常用算法及特点

    这篇文章主要给大家介绍了关于Spring Boot接口限流的常用算法及特点的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Spring实例化bean的方式代码详解

    Spring实例化bean的方式代码详解

    这篇文章主要介绍了Spring实例化bean的方式代码详解,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论