SpringBoot统一功能处理示例详解(拦截器)
作者:白杨783
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统一功能处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!