后端的加解密方法

106 阅读2分钟

1.使用拦截器Interceptor

需要写一个配置类,添加拦截器。如下,路径带app的所有请求都会被拦截器拦截。

在拦截器里面可以实现一些操作,用户的登陆验证,数据加解密等。

拦截器里面的方法。

preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用。

postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操作。

afterCompletion方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。

该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行。

SpringMVC中的Interceptor拦截器是链式的,可以同时存在多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。

(SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返回值为false,当preHandle的返回值为false的时候整个请求就结束了。)

源码解析:

Web请求被DispatcherServlet截获后,会调用DispatcherServlet的doDispatcher方法。

(这个图有解析所以用这张,代码都是doDispatcher这个方法里面的,懒得备注)

很明显地看到,在HandlerAdapter处理之后,以及处理完成之后会调用HandlerExecutionChain的方法。

HandlerExecutionChain的applyPreHandle、applyPostHandle、triggerAfterCompletion方法如下:

明显,就是调用内部实现HandlerInterceptor该接口集合的各个对应方法。

下面我们看下HandlerExecutionChain的构造过程。

HandlerExecutionChain是从HandlerMapping接口的getHandler方法获取的。

HandlerMapping的基础抽象类AbstractHandlerMapping中:

如图,加载所有的拦截器,

拦截器执行是按照注册顺序执行的,如代码

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(testInterceptor());
    registry.addInterceptor(testInterceptor2());
    registry.addInterceptor(testInterceptor3());
}
参考博客:https://blog.csdn.net/zl1zl2zl3/article/details/109103833

2.使用视图解析器进行加解密。

这个是我们公司的代码和框架,这个是一个继承了HttpServlet和接口ApplicationContextAware接口的类(相当于springMvc的DispatcherServlet),请求进来先进这个类,执行doPost。

然后就会调用个render方法。

这里加载视图解析器的render方法。

这是视图解析器里面的方法,进行是否加密的判断。

使用ResponseBodyAdvice和 RequestBodyAdvice进行加解密

因为这个方法没有试过,直接看博客:blog.csdn.net/lemon_TT/ar…