Springboot自定义注解实现用户登录状态校验(一)

拦截器方式

定义注解类

import java.lang.annotation.*;/*** @author:小飞猪* @date:2020/12/1 21:31* @version:1.0* @description:登录权限校验注解*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface LoginCheck {/*** 方法描述* @return*/String description() default "";/*** 方法是否必须校验* @return*/boolean required() default true;/*** 方法权限描述(这里可以考虑整一个权限枚举,比较方便)* @return*/String value() default "";}

实现拦截器拦截权限注解

import com.tobu.funnykits.annotions.LoginCheck;
import com.tobu.funnykits.core.domain.entity.UserInfo;
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;/*** @author:小飞猪* @date:2020/12/1 21:25* @version:1.0* @description:登录拦截器(拦截器方式)*/
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 验证权限if (this.hasPermission(request, handler)) {return true;}// 如果没有权限 则抛403异常 springboot会处理,跳转到 /error/403 页面response.sendError(HttpStatus.FORBIDDEN.value(), "对不起,无目标方法的访问权限");return false;}/*** 判断权限** @param handler* @return*/private boolean hasPermission(HttpServletRequest request, Object handler) {System.out.println("进入权限校验===========,当前时间:"+LocalDateTime.now());if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;//获取方法上的注解LoginCheck loginCheck = handlerMethod.getMethod().getAnnotation(LoginCheck.class);//情况1:方法未被注解修饰,则直接返回无权限if (loginCheck == null) {return false;}//情况2:方法被注解修饰不是必须校验类型,则返回正常if (loginCheck.required() == Boolean.FALSE) {return true;}//判断登录用户状况/*** 实现方式参考:从seesion中获取用户身份令牌并验证:当用户成功登录时创建随机加密的身份令牌,(key:身份          *令牌,value:登录名)存储到Redis中并配置自定义的失效时间,同时放入到全局session。当进行权限校验时,          *从全局session中获取到令牌,将获取到的令牌到redis中匹配是否存在,从而达到用户登录状态判断的目的*///判断用户是否登录Object loginToken = request.getSession().getAttribute("LOGIN_TOKEN");if (loginToken == null) {return false;}else{if(redisTemplate.hasKey(loginToken.toString())){//存在Key,可以进一步匹配Value}else{return false;}}//获取该用户的相关信息,并判断是否有权限Object loginUserObj = request.getSession().getAttribute("LOGIN_USER");UserInfo userInfo = (UserInfo)loginUserObj;String permission = userInfo.getPermission();if (permissionSet.isEmpty()) {return false;}//获取注解上的value值(也就是该方法的允许权限类型)return permission.equals(handlerMethod.getMethod().getDeclaringClass().getName()+"."+controllerMethodPermissionStr);}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

注册拦截器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author:小飞猪* @date:2020/12/1 21:52* @version:1.0* @description:注册权限拦截器*/
@Configuration
public class PermissionConfig implements WebMvcConfigurer {@Beanpublic LoginInterceptor loginInterceptor() {return new LoginInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor()).excludePathPatterns("/static/*").excludePathPatterns("/error").addPathPatterns("/**");}
}

demo

   /*** 获取随机密码* @return*/@GetMapping("/getRandomPassword")@LoginCheck(description = "获取随机密码",required = true,value = "GET")public String getRandomPassword(){return randomPassWordService.getRandomPassWord();}

Springboot自定义注解实现用户登录状态校验(一)相关推荐

  1. SpringBoot自定义注解实现身份证号格式校验

    背景 ​ 身份证的组成部分较为复杂, 如果仅使用正则表达式的话, 有些情况也无法校验出来, 例如正确的证件号为513334200310119074, 如果把最后一位变成9, 则是一个错误的证件号, 但 ...

  2. 魔方APP项目-07-客户端提交登录信息、在APICloud中集成防水墙验证码,前端获取显示并校验验证码、服务端校验验证码、保存用户登录状态,APICloud提供的数据存储、客户端保存用户登陆数据

    用户登录 一.客户端提交登录信息 html/login.html,代码: <!DOCTYPE html> <html> <head><title>登录& ...

  3. springboot 自定义注解拦截器

    springboot 自定义注解拦截器 最近在工作中,发现自定义注解拦截使用起来特别方便,现在来写出来给大家看看 环境springboot 首先写一个自定义注解 package com.study.c ...

  4. uni 登录token方法_uni-app 中保持用户登录状态

    在应用中保持登录状态是一个应用常见的需求,本文简单介绍下在 uni-app 中如何保存用户登录状态. 简介 uni-app 中不支持读写 cookie,所以不能如传统的应用那样通过读取 cookie ...

  5. php怎么判断账号已登录,PHP判断用户登录状态

    1,浏览器URL访问页面资源, 2,查看SESSION会话是否记录登陆状态,如"否"从3继续,如"是"则到5 3,获取浏览器客户端的COOKIE用户标识信息,如 ...

  6. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享 欢迎拍砖

    小论坛地址: http://rayyu.5d6d.com/thread-9444-1-1.html 正文: 首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. ...

  7. python微信登录失效_[基本解决]尝试去搞清楚微信网页授权后如何保持用户登录状态...

    之前已经: 已经可以微信网页授权了 可以获取用户基本信息了 现在想要去搞清楚: 微信公众号 如何保持登录 ->获取了openid,就是认为已经登录了? "方法1:将微信号认证一下,使用 ...

  8. JavaWeb中使用session保持用户登录状态

    使用session保持用户登录状态 // 登录 成功// 保存用户登录的信息到Session域中req.getSession().setAttribute("user", logi ...

  9. @retention注解作用_分分钟带你玩转SpringBoot自定义注解

    在工作中,我们有时候需要将一些公共的功能封装,比如操作日志的存储,防重复提交等等.这些功能有些接口会用到,为了便于其他接口和方法的使用,做成自定义注解,侵入性更低一点.别人用的话直接注解就好.下面就来 ...

最新文章

  1. Kaggle机器学习入门实战 -- Titanic乘客生还预测
  2. 基于Hadoop的数据分析平台搭建
  3. 统计插件_CG Teamwork统计提交量插件制作思路
  4. [深度学习] Keras 如何使用fit和fit_generator
  5. javascript节点的操作 创建、添加、移除、移动、复制
  6. 可伸缩多线程任务队列
  7. 并发编程学习(2)----volatile与synchronized
  8. android自定义pickerview,一个非常好用的Android PickerView库
  9. python win32api.sendmessage_Python win32api sendmasg
  10. 爬虫------12306
  11. 《一次与IP MTU、TCP MSS导致SSL协商失败的案例》—那些年踩过的坑(二)
  12. Alpha测试、Beta测试和验收测试的含义与区别
  13. [绍棠] iOS视频播放AVPlayer的视频内容拉伸设置
  14. 如何将两个excel表格合并
  15. 计算机产品选型与配置,高校校园网设备的选型和配置.DOC
  16. autoCAD数据库读写
  17. 16条生活潜规则:没人明说,但很重要
  18. Xilinx MicroBlaze软核驱动DDR4
  19. 湖南省第六届大学生计算机程序设计竞赛---弟弟的作业
  20. amoled led 排列_AMOLED 屏幕和 LCD 屏幕哪个更伤眼?

热门文章

  1. NetScaler http 请求克隆复制
  2. mysql学习--1.事务
  3. centos下 安装jdk
  4. C# 指针操作图像 细化处理
  5. 酷盘API C# 测试版
  6. ORACLE PL/SQ入门
  7. L1-021. 重要的话说三遍-PAT团体程序设计天梯赛GPLT
  8. 1025. 反转链表 (25)-浙大PAT乙级真题
  9. 计算机基础说课稿十分钟,关于《计算机应用基础》的说课稿一、教材分析(说教材):.pdf...
  10. a标签download属性无效_使用这些 CSS 属性选择器来提高前端开发效率