springboot的拦截器和限制单一用户登录

编程知识 更新时间:2023-05-02 02:35:39

因为项目使用是用户登录redis缓存一个token,所以当用户在a设备登录时,便缓存了tokenA,这时用户去b设备登录,新缓存了一个tokenB,如果用户使用a设备去请求,token已经失效,从而实现单一设备登录

1 实现接口HandlerInterceptor


public class MiniInterceptor implements HandlerInterceptor{
    /**
     * 请求controller之前
        true放行,false拦截并返回response
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截请求"+request.getRequestURL());
        //验证逻辑
        return false;
    }

    /**
     *请求controller成功返回视图之前
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 请求成功,返回视图之后
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

2 配置注入拦截器

  @Configuration//标志为配置文件
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
    
    把拦截器注册到springmvc中
     /**
     * 注册miniInterceptor为bean到SpringMvc
     */
    @Bean
    public MiniInterceptor miniInterceptor(){
        return new MiniInterceptor();
    }
    /**
     * 拦截器注册中心  注册到拦截器里面去 实现addInterceptors方法 添加拦截规则
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(miniInterceptor()).addPathPatterns("/user/**");
        super.addInterceptors(registry);
    }
    

3 完善业务逻辑 逻辑在拦截器的preHander方法中,

- 把认证信息和业务信息区分开,吧userid和token写在请求头里(可忽略)
        String userId = request.getHeader("userId");
        String userToken = request.getHeader("userToken");

- 怎么吧拦截信息返回回去
把信息写在preHandle的response中
~~~
  returnErrorResponse(response,new JSONResult().errorTokenMsg("登录超时"));

      /**
    * @author XieLinan
    * @create 2018/9/10 0010 16:15
    * @desc     将错误信息返回给前端
    * @Version: 1.0
    */
    public void returnErrorResponse(HttpServletResponse response, JSONResult result) throws IOException {
        //设置响应信息的内容格式
        response.setContentType("test/json");
        //设置响应信息的编码
        response.setCharacterEncoding("utf-8");
        OutputStream outputStream = null;
        //获得响应对象的输入流 把数据写入
        try {
            response.reset();
            outputStream = response.getOutputStream();
            byte[] b = JsonUtils.objectToJson(result).getBytes("utf-8");
            outputStream.write(b);
            outputStream.flush();
        }finally {
            //关闭流
            if(outputStream != null){
               outputStream.close();
            }
        }
    }
~~~

有任何问题欢迎指点 qq 1294235127

更多推荐

springboot的拦截器和限制单一用户登录

本文发布于:2023-04-25 07:36:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/c528d5c5dff807cde1184de649b83b7c.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:用户登录   拦截器   springboot

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 102456文章数
  • 26161阅读数
  • 0评论数