前言:
在开发当中,我们经常会去验证用户登录状态和获取用户信息。如果每次都手动去调用用户信息查询接口,会非常的繁琐,为了提高开发效率,因此就有了今天这篇文章。
思路:
用户请求我们的方法会带上一个Token,然后通过Filter过滤器将查出来的会员信息放到request请求中去。接着在Cotroller层的请求方法中接收一个MemberDeatails参数,就能直接得到会员信息了。
详细步骤:1. Gradle引入需要的Jar包:2. 定义一个Login注解
3. 定义一个MemberDetails.class,用于封装用户信息
5. 定义一个会员接口类
6. 定义一个会员接口实现类,在里面写上用户信息获取方法
7. 定义一个Request请求包装类
通过继承HttpServletRequestWrapper类,重写它里面的多个方法,对前端传过来的参数进行重新封装。因为在Filter,虽然可以通过request.getParameterMap()拿到一个含有参数的map,但是不能直接对request里面东西进行修改操作,一旦重新修改,就会报错。后来我发现j2ee已经给我们提供了解决的办法,使用HttpServletRequestWrapper类来解决向request添加额外参数的功能。于是我对HttpServletRequest进行重新包装,在里面重新定义一个map,将以前的参数put进去,并将我们需要添加的参数放进去,达到我们想要的效果。
8. 定义一个过滤器
在这个过滤里面,主要校验Token是否有效以及将会员信息添加到request。首先,从Request请求头中拿到前端传过来的Token,并使用Token调用会员信息获取接口,得到用户的资料,然后将用户信息put到ParameterMap中,这个ParameterMap是我们通过ParameterRequestWrapper重新包装的一个map,因此可以在里面添加会员的参数,然后将新的request传递出去。
9. 定义一个SpringMVC拦截器
在这个拦截器里面,主要验证Controller方法中是否需要MemberDetails和是否标了@Login注解。首先,从HandlerMethod中获取所有入参,看有没有需要MemberDetails参数,如果有,就从HttpServletRequest中拿memberId,如果不存在说明没有登录,存在就通过。然后HandlerMethod获取@Login注解,判断是否存在,如果存在,就看有没有memberId,没有就不通过。
10. 将拦截器注册到WebMvcConfigurer中
11. 定义会员Controller
经过一个过滤器和一个拦截器,request请求终于来到了我们Controller层。这时候,我们只需要在方法里面写入MemberDetails memberDetails 就OK了,不用做任何操作,我们就可以获取会员信息了,是不是炒鸡方便!另外还可以在方法上标@Login注解。
运行结果:
遇到的坑:
当时我尝试过把会员参数放到session域中的Attribute,也尝试过在Model里setAttribute。后来发现这是行不通的,在filter中直接使用request.setAttribute()是无效的。放在Modle也是可行,但是Controller里面的方法需要加@ModelAttribute(“…”)才能得到用户信息,很不方便。唯有通过request.getParameterMap() put()进去,才是最方便的。
一开始我没想到用过滤器,因此我就尝试在拦截器里,直接通过ParameterRequestWrapper对request包装,后来发现不管我怎么弄都不成功。当时非常绝望,后来想了想会不会是拦截器不支持重新包装request,于是我就通过filter去做,没想到成功了。这时,我想既然用到了filter,那干脆直接在filter里面获取@Login注解和获取方法参数得了,后来发现filter里面拿不到方法的信息,哭。后来想到一个办法,可以通过先filter,后拦截器。于是就成功了!
后记:
这篇文章只是记录了我的一点小小经验,如果有什么不对的地方或者有更好的方法,请大家在评论里留言指正!
领取专属 10元无门槛券
私享最新 技术干货