1.过滤器:Filter接口
参数校验:用户输入的参数可能包含恶意字符或参数格式错误,通过使用Filter可以拦截并进行参数校验,以保证应用安全。
多语言选择:通过获取请求头的语言参数,Filter可以根据用户的语言选择相应的语言。
登录拦截:通过Filter对所有请求进行拦截,检查用户是否登录,若未登录则跳转至登录页面。
编码转换:对于不同的请求和响应,可能需要采用不同的编码方式,Filter可以将请求和响应进行编码转换。
访问控制:通过Filter实现拦截指定路径的请求,实现权限访问控制。
过滤敏感字符:
2.切面:Aspect注解
特点:可以获取到方法对应的入参与返参对象,通过比较,日志记录最好的方式还是Aspect,可以方便地获取到入参和出参。并能记录执行方法耗时。
应该场景1:记录日志
应该场景2:权限判断
关键代码:joinPoint.getArgs(),该对象数组中有些类是无法序列化的,需要剔除,如MultipartFile[],StandarMultipartHttpServletRequest HttpServletRequest httpServletResponse null
实操:获取方法名;获取入参;获取出参
2.拦截器:HandlerInterceptor接口
特点:需要在webmvcConfig中手动注入,获取出参和出参相对较麻烦
应该场景1:日志记录
应该场景2:权限检查
3.ControllerAdvice注解(Controller增强,自spring3.2的时候推出):
应该场景1.用于全局的异常拦截和处理,这里的异常可以使自定义异常也可以是JDK里面的异常。
应该场景2.用于处理数据库事务回滚,并将异常信息友好的显示给用户。
4.RequestBodyAdvice接口 (spring 4.2新加的接口)
特点:可以获取到request对象,对request对象中的参数进行改写,并对后续操作能接收到修改后的数据。只能处理post请求,get请求响应不了。
应该场景:对入参进行解密
关键代码:// 提取数据 InputStream is = httpInputMessage.getBody();流读出来后必须重新赋值,不然业务接收不到数据了。
5.ResponseBodyAdvice接口(spring 4.2新加的接口)
特点:可以获取到返回值,但该返回值必须是某类的子类或某接口的实现类,可以定义为Object,可以对请求结果进行统一处理,比aspect注解修改返回值方便直观。
应用场景:对出参进行加密,
整体时序
HandlerInterceptor preHandle ->
RequestBodyAdvice ->
HandlerMethodArgumentResolver ->
RequestBodyAdvice ->
controller ->
AOP afterReturning ->
ResponseBodyAdvice beforeBodyWrite ->
HttpMessageConverter(转JSON )->
HandlerInterceptor postHandle ->
HandlerInterceptor afterCompletion