欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

手写Spring-MVC之前后置处理器与异常处理、数据库框架-首先搭建前后置处理器的框架: 和是否处理JSON格式的数据类似,需要根据注解判断controller层中的方法是否需要对JSON格式的数据进行解密或者返回数据进行加密,因此要添加两个注解@BeforeAdviser和@AfterAdviser @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface BeforeAdviser { } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AfterAdviser { } controller层的方法需要添加相应的注解标识 /** * 使用postman发送请求 * url:http://localhost:8080/user/t

最编程 2024-07-06 06:57:32
...

前后置处理器的框架搭建好之后,会发现一个问题,如果在DispatcherServlet中进行具体的解密加密的话,那么在用户使用该框架的时候,就只能使用框架所规定的解密加密,这显然不具有灵活性。不同的用户解密、加密逻辑不同,所以这里的思路是在框架中只写抽象类,在DispatcherServlet中利用多态创建抽象类的继承类对象,调用继承类对象中的解密加密方法。而在web模块中用户可以自己重写一个解密加密抽象方法,这样调用的就是用户自定义的逻辑方法了。

抽象方法:

public abstract class HanderAdviserResolver {
 public abstract String beforeRequestBody(String reqData);
 public abstract String afterResponseBody(String respData);

 public String before(String reqData){
     return beforeRequestBody(reqData);
 }
 public String after(String respData){
     return afterResponseBody(respData);
 }
}

注意:这里的抽象方法是交给用户重写的,而自己的成员方法则直接调用抽象方法,通过这种方式实现在DispatcherServlet中调用用户重写方法的逻辑。

用户自定义前后置处理器:

public class BeforeAndAfterAdviser extends HanderAdviserResolver {
 @Override
 public String beforeRequestBody(String reqData) {
     System.out.println("解密:"+reqData);
     return reqData;
 }

 @Override
 public String afterResponseBody(String respData) {
     System.out.println("加密:"+respData);
     return respData;
 }
}

又一个问题来了,框架中怎样拿到用户自定义的类对象呢?思路和监听器拿到controller层类对象相似,通过配置文件拿到注解类,注解类通过一个注解注明用户自定义的前后置处理器路径。这样的注解叫做使能注解,它的功能就是使得DispatcherServlet能够拿到用户自定义类。然后在DispatcherServlet中重写init()方法,在方法中获取配置文件信息,进而拿到注解类,通过注解类的注解信息拿到自定义前后置处理器类对象,调用其重写的解密加密处理方法。

使能注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableAdviser {
 String adviserPackage();
}

注解类:

@EnableAdviser(adviserPackage= "com.qf.shop.web.adviser.BeforeAndAfterAdviser")

DispatcherServlet中:

private HanderAdviserResolver adviserResolver;

public HanderAdviserResolver getAdviserResolver(String config){

     try {
         Class<?> clazz = Class.forName(config);
         EnableAdviser enableAdviserAnnotation = clazz.getAnnotation(EnableAdviser.class);

         String adviserPackage = enableAdviserAnnotation.adviserPackage();
         if(adviserPackage!=null){
             Class<?> adviserClass = Class.forName(adviserPackage);
             adviserResolver = (HanderAdviserResolver) adviserClass.newInstance();
         }

         return adviserResolver;


     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
         throw new RuntimeException(e);
     }
 }


@Override
 public void init() throws ServletException {
     ServletContext servletContext = this.getServletContext();
     String config = servletContext.getInitParameter("config");
     adviserResolver = getAdviserResolver(config);
     

 }
//加密
if(methodDefinition.isAfterAdviserHasOrNot()){
 jsonString = adviserResolver.after(jsonString);
}
//解密
if(parameterDefinition.isBeforeAdviserHasOrNot()){
 jsonStr = adviserResolver.before(jsonStr);
}

推荐阅读