当前位置:   article > 正文

统一异常拦截和非法sql拦截_数据库异常怎么做异常拦截处理

数据库异常怎么做异常拦截处理

目录

统一异常拦截

异常拦截的原因:

实现原理:

核心代码:

aop切面实现操作记录(操作留痕)

业务场景:

实现原理:

核心代码:

非法sql拦截

业务场景:

实现原理:

核心代码:


统一异常拦截

异常拦截的原因:

1,对于前端用户比较友好。通过统一异常拦截我们可以将后端的异常(没有try,catch住的)给拦截住,对于数据库报错,空指针等敏感报错,接口不会直接暴露给前端。

2,对后端比较友好。开发不用每次编码都进行try,catch,降低了开发的复杂度。将所有异常处理放在一个类中进行集中的统一处理,只需要修改一处,即可拦截所有的异常。

实现原理:

@RestControllerAdvice和@ExceptionHandler

        RestControllerAdvice:可以拦截所有的controller。

        ExceptionHandler:当一个Controller中有方法加ExceptionHandler之后,这个Controller其他方法中没有捕获的异常就会以参数的形式传入加了ExceptionHandler注解的那个方法中。

核心代码:

  1. @RestControllerAdvice
  2. @Slf4j
  3. public class ExceptionAdvice {
  4. @ResponseBody
  5. @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
  6. @ExceptionHandler(Exception.class)
  7. public JSONObject exceptionHandler(Exception e){
  8. log.error("执行异常",e);
  9. if (e instanceof MethodArgumentNotValidException){
  10. MethodArgumentNotValidException exception = (MethodArgumentNotValidException)e;
  11. return JSONObjectUtil.error(exception.getBindingResult().getFieldError().getDefaultMessage());
  12. }
  13. else if(e instanceof ServiceException){
  14. ServiceException exception = (ServiceException) e;
  15. return JSONObjectUtil.error(exception.getMessage());
  16. }
  17. else {
  18. return JSONObjectUtil.error("内部错误,请联系管理员!");
  19. }
  20. }

制造一个错误,运行结果:

不加之前:

加上ExceptionAdvice:

异常分为系统异常和业务异常。

系统异常:不可预知的异常,数据库报错,比如说程序空指针。

业务异常:可以预制的异常。比如说该传验证码没传,该传某个参数没传。

aop切面实现操作记录(操作留痕)

业务场景:

        用户每次在系统中进行update操作都需要形成操作记录。

实现原理:

ioc+aop

核心代码:

定义切点:

  1. /**
  2. * 操作记录切点
  3. *
  4. * @author LYX
  5. * @date 2022/12/03
  6. */
  7. @Aspect
  8. @Component
  9. @DependsOn("springFactoryUtils")
  10. public class OperationRecord{
  11. private static Map<String, jiLuService> beanMap = SpringFactoryUtils.getBeanMap(jiLuService.class);
  12. /**
  13. * 1,定义切点
  14. * 2,定义切点之前执行
  15. * 3,定义切点之后执行
  16. */
  17. @Pointcut("@annotation(com.example.lyxtest.annotation.Log)")
  18. public void logPointCut() {
  19. }
  20. /**
  21. * 在切点之前执行
  22. *
  23. * @param joinPoint 连接点
  24. * @param log 日志
  25. */
  26. @Before("logPointCut() && @annotation(log)")
  27. public void beforePointCut(JoinPoint joinPoint, Log log){
  28. //获取到方法入参
  29. Object[] args = joinPoint.getArgs();
  30. jiLuService jiLuService = beanMap.get(log.handleType());
  31. jiLuService.before(args,log);
  32. }
  33. /**
  34. * 在切点之后执行
  35. *
  36. * @param joinPoint 连接点
  37. * @param result 结果
  38. */
  39. @AfterReturning(returning = "result",pointcut = " @annotation(com.example.lyxtest.annotation.Log)")
  40. public void afterPointCut(JoinPoint joinPoint,Object result){
  41. JSONObject outJson = (JSONObject) result;
  42. if(200 == Integer.valueOf(outJson.get("code").toString())){
  43. //获得方法入参
  44. Object[] args = joinPoint.getArgs();
  45. //获取handle
  46. MethodSignature signature = (MethodSignature)joinPoint.getSignature();
  47. String handle = signature.getMethod().getAnnotation(Log.class).handleType();
  48. jiLuService jiLuService = beanMap.get(handle);
  49. jiLuService.after(args,signature);
  50. }
  51. }
  52. }

实现类:

  1. /**
  2. * 操作记录实现类
  3. *
  4. * @author LYX
  5. * @date 2022/12/03
  6. */
  7. @Component
  8. @Slf4j
  9. public abstract class RecordService {
  10. /**
  11. * 之前
  12. *
  13. * @param args arg游戏
  14. */
  15. public void before(Object[] args, Log loga){
  16. log.info("handle:{},入参:{}",loga.handleType(), args);
  17. };
  18. /**
  19. * 后
  20. *
  21. * @param args arg游戏
  22. * @param signature 签名
  23. */
  24. public abstract void after(Object[] args, MethodSignature signature);
  25. }

具体操作:

  1. /**
  2. * 部门查询handle
  3. *
  4. * @author LYXLYX
  5. * @date 2022/12/03
  6. */
  7. @Component("yhcx")
  8. @Slf4j
  9. public class yhcxHandle extends RecordService {
  10. @Override
  11. public void after(Object[] args, MethodSignature signature) {
  12. User user = (User) args[0];
  13. log.info("操作功能:{},操作值:{}",signature.getMethod().getAnnotation(Log.class).czgn(),String.valueOf(user));
  14. }
  15. }

Controller层中插入@Log注解:

@Log(handleType = "yhcx",czgn = "部门查询")

定义注解:

  1. /**
  2. * 日志
  3. *
  4. * @author LYX
  5. * @date 2022/12/03
  6. */
  7. @Target({ElementType.PARAMETER, ElementType.METHOD})
  8. @Retention(RetentionPolicy.RUNTIME)
  9. @Documented
  10. public @interface Log {
  11. /**
  12. * 处理类型
  13. *
  14. * @return
  15. */
  16. String handleType() default "";
  17. /**
  18. * 操作功能
  19. */
  20. String czgn() default "";
  21. }

结果展示:

非法sql拦截

业务场景:

不带where条件的更新和删除在生产环境中是非常危险的,比如说使用了when这种条件语句,如果这些都交给开发人员去用代码去判断会增加很多工作量。针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除

实现原理:

mybatis-plus官方自带插件,地址:防全表更新与删除插件 | MyBatis-Plus

核心代码:

  1. /**
  2. * mybatis +配置
  3. *
  4. * @author LYX
  5. * @date 2022/12/03
  6. */
  7. @Configuration
  8. public class MybatisPlusConfig {
  9. @Bean
  10. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  11. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  12. interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
  13. return interceptor;
  14. }
  15. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/425487
推荐阅读
相关标签
  

闽ICP备14008679号