首页 > 应用开发 > > 你是怎么用Spring MVC拦截器的
介绍
我们要写自己的拦截器一般有两种方式。
1.实现HandlerInterceptor接口
2.继承HandlerInterceptorAdapter抽象类
我就直接继承了HandlerInterceptorAdapter抽象类,按需重写部分实现即可。
HandlerInterceptor有如下3个方法
preHandler:在controller执行之前调用
postHandler:controller执行之后,且页面渲染之前调用
afterCompletion:页面渲染之后调用,一般用于资源清理操作
先定义一下返回值,因为这是一个微服务项目,最好把项目的返回值都统一成一个对象,这样序列化和反序列化都比较方便,而且前端解析也很方便。
记录接口响应时间
这个拦截器记录了每个接口的响应时间,还有接口的路径及参数,有了路径,参数,响应时间这3个指标,排查问题应该很方便了。
判断用户是否登录
登录接口为
登录成功会设置session的属性值。
可以看到当从session中取不到相应的用户信息时,说明用户没有登录,应该提示登录
。当用户已经登录时会调用request.setAttribute方法,设置一下用户的信息,方便记录操作人之类的。后面会演示到。
这里用了一个工具类,来重写返回的json
JsonUtil是我写的将对象转为json的工具类
没有登录显示
{
"code": 2,
"desc": "请登录"
}
登录成功显示
{
"code": 0,
"desc": "成功"
}
判断用户的权限
这个项目的权限是基于RBAC(Role-Based Access Control,基于角色的访问控制)来做的,简答来说需要五张表。
用户表
用户角色关联表
角色表
角色权限关联表
权限表
基于这种模型,用注解+拦截器来实现权限管理还是很容易的,大概演示一下
权限注解(在需要进行权限校验的url上加,id属性一般为权限id)
如下面代码,删除用户需要id=0的权限(默认值),并且会打印出操作人是谁,request.getAttribute之所以能取到值,是因为在登录的时候已经设置了,可以看一下前面,当出现问题的时候就可以迅速排查到哪些用户做了哪些操作,能迅速找到责任人,当然我这里打印的信息很少,简单演示一下就行。
拦截器如下
这个拦截器是和登录拦截器一起使用的,不然会让用户一直登录。
接口权限校验
这个写起来比较长,单开一篇吧。
配置
配置拦截器的方法如下,注意顺序的问题,最起码本节中LoginInterceptor和AuthorityInterceptor这2个拦截器的顺序是不能颠倒的。
图没截全,放一下代码
@Configuration
public 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 1
preHandler 2
postHandler 2
postHandler 1
afterCompletion 2
afterCompletion 1
github地址为:
https://github.com/erlieStar/interceptor-demo
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/615/viewspace-3167662/ ,如需转载,请注明出处,否则将追究法律责任。