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…