在拦截器里放入参数 controller_面试官:你是怎么用Spring MVC拦截器的

a20dd0c72d22a15fa9833e63ede1828a.png

介绍

我们要写自己的拦截器一般有两种方式。

1.实现HandlerInterceptor接口

2.继承HandlerInterceptorAdapter抽象类

我就直接继承了HandlerInterceptorAdapter抽象类,按需重写部分实现即可。

HandlerInterceptor有如下3个方法

preHandler:在controller执行之前调用

postHandler:controller执行之后,且页面渲染之前调用

afterCompletion:页面渲染之后调用,一般用于资源清理操作

先定义一下返回值,因为这是一个微服务项目,最好把项目的返回值都统一成一个对象,这样序列化和反序列化都比较方便,而且前端解析也很方便。

ee275ba127fb332569c7fc4452343350.png

记录接口响应时间

210e2d15739732880594cd17bf56d65a.png

这个拦截器记录了每个接口的响应时间,还有接口的路径及参数,有了路径,参数,响应时间这3个指标,排查问题应该很方便了。

判断用户是否登录

登录接口为

e57379eabf51714b11404150ac14342d.png

登录成功会设置session的属性值。

412424b4acbe093b4b041b9cf7828efe.png

可以看到当从session中取不到相应的用户信息时,说明用户没有登录,应该提示登录

。当用户已经登录时会调用request.setAttribute方法,设置一下用户的信息,方便记录操作人之类的。后面会演示到。

这里用了一个工具类,来重写返回的json

be63f4b166c81900d7ff64bd3a83e659.png

JsonUtil是我写的将对象转为json的工具类

没有登录显示

{ "code": 2, "desc": "请登录"}

登录成功显示

{ "code": 0, "desc": "成功"}

判断用户的权限

这个项目的权限是基于RBAC(Role-Based Access Control,基于角色的访问控制)来做的,简答来说需要五张表。

用户表

用户角色关联表

角色表

角色权限关联表

权限表

基于这种模型,用注解+拦截器来实现权限管理还是很容易的,大概演示一下

权限注解(在需要进行权限校验的url上加,id属性一般为权限id)

2bbc316f7f8f4f65cbb2a3097d6edbd5.png

如下面代码,删除用户需要id=0的权限(默认值),并且会打印出操作人是谁,request.getAttribute之所以能取到值,是因为在登录的时候已经设置了,可以看一下前面,当出现问题的时候就可以迅速排查到哪些用户做了哪些操作,能迅速找到责任人,当然我这里打印的信息很少,简单演示一下就行。

4d94334470b81dfd1c4c80a2bdb8b722.png

拦截器如下

9759919e228e5532b642fce7e0a6a37d.png

这个拦截器是和登录拦截器一起使用的,不然会让用户一直登录。

接口权限校验

这个写起来比较长,单开一篇吧。

配置

配置拦截器的方法如下,注意顺序的问题,最起码本节中LoginInterceptor和AuthorityInterceptor这2个拦截器的顺序是不能颠倒的。

15ded624f207a7b8e88112bd4a23f9cb.png

图没截全,放一下代码

@Configurationpublic class DemoWebMvcConfigurerAdapter extends WebMvcConfigurationSupport { @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SystemInterceptor()); registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login"); registry.addInterceptor(new AuthorityInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login"); }}

说一下拦截器的执行顺序,有2个拦截器,则执行顺序为

preHandler 1preHandler 2postHandler 2postHandler 1afterCompletion 2afterCompletion 1

github地址为:

https://github.com/erlieStar/interceptor-demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值