SpringBoot统一功能处理

本文介绍了如何在SpringMVC中实现自定义拦截器进行用户登录验证,以及如何使用@ControllerAdvice和@ExceptionHandler进行统一异常处理和返回数据格式化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.自定义拦截器

拦截器的实现分两步
1.创建自定义拦截器
2.将⾃定义拦截器加⼊ WebMvcConfigurer 的 addInterceptors ⽅法中。

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("userinfo") != null)
 		 {
 			return true;
 		}
 		response.setStatus(401);
 		return false;
	}
}

将⾃定义拦截器加⼊到系统配置
将上⼀步中的⾃定义拦截器加⼊到系统配置信息中,具体实现代码如下:

@Configuration
public class AppConfig implements WebMvcConfigurer {
 // 添加拦截器
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
 registry.addInterceptor(new LoginInterceptor())
 .addPathPatterns("/**") // 拦截所有接⼝
 .excludePathPatterns("/art/param11"); // 排除接⼝

 }
}
  • addPathPatterns表示拦截接口
  • excludePathPatterns表示不拦截的接口

排除所有的静态资源

@Override

public void addInterceptors(InterceptorRegistry registry) {
 registry.addInterceptor(new LoginInterceptor())
 .addPathPatterns("/**") // 拦截所有接⼝

 .excludePathPatterns("/**/*.js")
 .excludePathPatterns("/**/*.css")
 .excludePathPatterns("/**/*.jpg")
 .excludePathPatterns("/login.html")
 .excludePathPatterns("/**/login"); // 排除接⼝

2.拦截器原理

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

3.统一异常处理

统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice 表
示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执⾏某个通知,
也就是执⾏某个⽅法事件,具体实现代码如下:

@ControllerAdvice

public class ErrorAdive {
 @ExceptionHandler(Exception.class)
 @ResponseBody

 public Object handler(Exception e) {
 HashMap<String, Object> map = new HashMap<>();
 map.put("state", 0);
 map.put("data", null);
 map.put("msg", e.getMessage());
 return map;
 }
}

当有多个异常通知时,匹配顺序为当前类及其⼦类向上依次匹配

4.统一返回数据格式

使用统一返回数据格式好处有:

  • 方便前后端交互,降低沟通成本
  • 方便维护

统⼀的数据返回格式可以使⽤ @ControllerAdvice + ResponseBodyAdvice 的⽅式实现,具体实现代
码如下:

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
 /**
 * 内容是否需要重写(通过此⽅法可以选择性部分控制器和⽅法进⾏重写)
 * 返回 true 表示重写
 */
 
 @Override
 public boolean supports(MethodParameter returnType, Class converterTyp
e) {
 return true;
 }
 /**
 * ⽅法返回之前调⽤此⽅法
 */

 @Override
 public Object beforeBodyWrite(Object body, MethodParameter returnType,
 MediaType selectedContentType,Class selectedConverterType, ServerHttpRequest request,ServerHttpResponse response) {
 if(body instanceof HashMap){
 	return body;
 }
 // 构造统⼀返回对象
 HashMap<String, Object> result = new HashMap<>();
 result.put("state", 1);
 result.put("msg", "");
 result.put("data", body);
 return result;
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1无名之辈1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值