Spring Boot实现功能的统一详解

网友投稿 466 2022-07-22


目录1. 统一用户登录权限验证1.1 自定义拦截器1.2 将自定义拦截器加入到系统配置1.3 运行结果1.4 总结2. 统一异常处理2.1 代码实现2.2 运行结果3. 统一数据返回格式3.1 代码实现3.2 运行结果

1. 统一用户登录权限验证

拦截器的实现分为两步:

创建自定义拦截器, 实现 HandlerInterceptor 接口并重写 preHandle 方法

配置拦截器和拦截规则, (将自定义拦截器加入 WebMvcConfigurer 的 addInterceptors 方法中)

1.1 自定义拦截器

public class LoginInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

HttpSession session = request.getSession(false);

if (session != null && session.getAttribute("user") != null) {

return true;

}

response.setStatus(401);

return false;

}

}

1.2 将自定义拦截器加入到系统配置

@Configuration

public class AppConfig implements WebMvcConfigurer {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new LoginInterceptor())

.addPathPatterns("/**") // 拦截所有的接口

.excludePathPatterns("/**/login.html"); // 排除的接口

}

}

addPathPatterns : 表示要拦截的URL.

excludePathPatterns : 表示需要排除的URL

1.3 运行结果

1.4 总结

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

2. 统一异常处理

统一异常处理使用的是 @ControllerAdvice + @ExceptionHandler 来实现的,

@ControllerAdvice 表示控制器通知类@ExceptionHandler 是异常处理器

两个结合表示当出现异常的时候执行某个通知, 也就是执行某个方法事件

2.1 代码实现

@ControllerAdvice

@ResponseBody

public class ErrorAdvice {

@ExceptionHandler(NullPointerException.class)

public Object nullPointerException(NullPointerException e) {

HashMap map = new HashMap<>();

map.put("success",200);

map.put("status",-1);

map.put("message","空指针异常!");

return map;

}

}

2.2 运行结果

@RestController

@RequestMapping("/user")

public class UserController {

@RequestMapping("/hi")

public String say() {

Object object = null;

int i = object.hashCode();

return "Hello";

}

}

3. 统一数据返回格式

统一的数据返回格式可以使用 @ControllerAdvice + ResponseBodyAdvice 的方式实现.

添加@ControllerAdvice实现ResponseBodyAdvice接口, 并重写beforeBodyWrite方法

3.1 代码实现

@ControllerAdvice

public class ResponseAdvice implements ResponseBodyAdvice {

/**

* 内容是否重写, 返回true表示重写

*/

@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 result = new HashMap<>();

result.put("success",200);

result.put("status",1);

result.put("data",body);

return result;

}

}

3.2 运行结果

@RestController

@RequestMapping("/user")

public class UserController {

@RequestMapping("/index")

public Object index() {

User user = new User();

user.setUsername("SpringAOP");

user.setPassword("123456");

return user;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring中自定义数据类型转换的方法详解
下一篇:RocketMQ整合SpringBoot实现生产级二次封装
相关文章

 发表评论

暂时没有评论,来抢沙发吧~