场景描述:现在需要对部分Controller或者Controller里面的服务方法进行权限拦截。如果存在我们自定义的注解,通过自定义注解提取所需的权限值,然后对比session中的权限判断当前用户是否具有对该控制器或控制器方法的访问权限。如果没有相关权限则终止控制器方法执行直接返回。有两种方式对这种情况进行处理。

方式一:使用SpringAOP中的环绕Around
方式二:使用Spring web拦截器

标签: Spring

代码片段(4)[全屏查看所有代码]

1. [代码]定义注解

?
1
2
3
4
5
6
7
8
9
10
11
12
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@Documented
//最高优先级
@Order(Ordered.HIGHEST_PRECEDENCE)
public @interface RoleControl {
    /**
     *
     * 角色类型,以便决定是否具有相关权限
     */
    String value() default "user";
}

2. [代码]在Controller中使用

?
1
2
3
4
5
6
7
8
9
10
11
12
@RoleControl("ADMIN")
@Controller
public class LoginController {
    @Autowired
    private UserService uService;
    @Autowired
    private GlobalConfigService gcService;
    @RoleControl("")
    @RequestMapping("/login")
    public String login(HttpServletRequest request,HttpServletResponse resp, @ModelAttribute("user") UserDto uDto) {
           return ""
}

3. [代码]方式一:使用SpringAOP中的环绕Around

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@Component
@Aspect
public class RoleControlAspect {
    /**类上注解情形 */
//  @Pointcut("@within(net.xby1993.springmvc.annotation.RoleControl)")
    @Pointcut("execution(* net.xby1993.springmvc.controller..*.*(..)) && @within(net.xby1993.springmvc.annotation.RoleControl)")
    public void aspect(){
         
    }
    /**方法上注解情形 */
    @Pointcut("execution(* net.xby1993.springmvc.controller..*.*(..)) && @annotation(net.xby1993.springmvc.annotation.RoleControl)")
    public void aspect2(){
         
    }
    /**aop实际拦截两种情形*/
    @Around("aspect() || aspect2()")
    public Object doBefore(ProceedingJoinPoint point) {
                    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        HttpSession session=request.getSession();
        Object target = point.getTarget();
        String method = point.getSignature().getName();
        Class<?> classz = target.getClass();
        Method m = ((MethodSignature) point.getSignature()).getMethod();
        try {
            if (classz!=null && m != null ) {
                boolean isClzAnnotation= classz.isAnnotationPresent(RoleControl.class);
                boolean isMethondAnnotation=m.isAnnotationPresent(RoleControl.class);
                RoleControl rc=null;
                //如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。
                if(isMethondAnnotation){
                    rc=m.getAnnotation(RoleControl.class);
                }else if(isClzAnnotation){
                    rc=classz.getAnnotation(RoleControl.class);
                }
                String value=rc.value();
                Object obj=session.getAttribute(GeneUtil.SESSION_USERTYPE_KEY);
                String curUserType=obj==null?"":obj.toString();
                //进行角色访问的权限控制,只有当前用户是需要的角色才予以访问。
                boolean isEquals=StringUtils.checkEquals(value, curUserType);
                if(isEquals){
                    try {
                        return point.proceed();
                    } catch (Throwable e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                 
            }
        }catch(Exception e){
             
        }
        return null;
    }
}

4. [代码]方式二:使用拦截器,推荐     跳至 [1] [2] [3] [4] [全屏预览]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import net.xby1993.springmvc.annotation.RoleControl;
import net.xby1993.springmvc.util.GeneUtil;
import net.xby1993.springmvc.util.PathUtil;
import net.xby1993.springmvc.util.StringUtils;
public class GlobalInterceptor extends HandlerInterceptorAdapter{
    private static Logger log=LoggerFactory.getLogger(LoginInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        HttpSession s=request.getSession();
        s.setAttribute("host", PathUtil.getHost());
        s.setAttribute("siteName", GeneUtil.SITE_NAME);
        //角色权限控制访问
        return roleControl(request,response,handler);
    }
    /**角色权限控制访问*/
    private boolean roleControl(HttpServletRequest request,HttpServletResponse response, Object handler){
        HttpSession session=request.getSession();
        System.out.println(handler.getClass().getName());
        if(handler instanceof HandlerMethod){
            HandlerMethod hm=(HandlerMethod)handler;
            Object target=hm.getBean();
            Class<?> clazz=hm.getBeanType();
            Method m=hm.getMethod();
            try {
                if (clazz!=null && m != null ) {
                    boolean isClzAnnotation= clazz.isAnnotationPresent(RoleControl.class);
                    boolean isMethondAnnotation=m.isAnnotationPresent(RoleControl.class);
                    RoleControl rc=null;
                    //如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。
                    if(isMethondAnnotation){
                        rc=m.getAnnotation(RoleControl.class);
                    }else if(isClzAnnotation){
                        rc=clazz.getAnnotation(RoleControl.class);
                    }
                    String value=rc.value();
                    Object obj=session.getAttribute(GeneUtil.SESSION_USERTYPE_KEY);
                    String curUserType=obj==null?"":obj.toString();
                    //进行角色访问的权限控制,只有当前用户是需要的角色才予以访问。
                    boolean isEquals=StringUtils.checkEquals(value, curUserType);
                    if(!isEquals){
                        //401未授权访问
                        response.setStatus(401);
                        return false;
                    }
                }
            }catch(Exception e){
                 
            }
        }
         
        return true;
    }

Java 注解 拦截器相关推荐

  1. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:wangzaiplus www.jianshu.com/p/ ...

  2. springboot + redis + 注解 + 拦截器 实现接口幂等性校验

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://www.jianshu.com/p/6189275403ed 一.概念 ...

  3. @slf4j注解_SpringBoot + Redis + 注解 + 拦截器 实现接口幂等性校验

    一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如: 订单接口, 不能多次创建订单 支付接口, 重复支付同一笔订单只能扣一次钱 支付宝回调接口, 可能会多 ...

  4. Java EE拦截器

    历史 我认为重要的是要看一下Java EE中的Interceptor的发展,因为它是从EJB特定的项目开始的,后来又演变成一个单独的规范,现在可供其他Java EE规范扩展,这一事实很简单. 版本1. ...

  5. redis 判断存在性_springboot + redis + 注解 + 拦截器 实现接口幂等性校验

    提醒:后面有些图片模糊,请点击原文查看清晰图片 一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如: 订单接口, 不能多次创建订单 支付接口, 重复支付同 ...

  6. jmeter校验结果_Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

    来自:简书,作者:wangzaiplus 链接:https://www.jianshu.com/p/6189275403ed 一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证 ...

  7. springboot 自定义注解拦截器

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

  8. springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验

    优质文章,及时送达 作者 | wangzaiplus 链接 | www.jianshu.com/p/6189275403ed 一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证 ...

  9. springboot幂等性_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验

    一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如:订单接口, 不能多次创建订单 支付接口, 重复支付同一笔订单只能扣一次钱 支付宝回调接口, 可能会多次 ...

最新文章

  1. list保留小数位数
  2. jooq 事务_将jOOQ与Spring结合使用:排序和分页
  3. c++ vector 指针
  4. EditText 自动保留两位小数
  5. 51单片机系列命名规则
  6. 重构:改善既有代码的设计(评注版) 评注者序
  7. 【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解
  8. python有道字典_Python基于有道实现英汉字典功能
  9. SecureCRT右键粘贴的设置
  10. 安装 Unity Hub 发现 进不了 Unity3D 了
  11. Thinkpad T430 重装系统不能从光盘或者U盘启动/BIOS设置 关于T430 无法光盘引导安装-BIOS设置问题...
  12. 利用pdf.js封装vue组件在vue中实现在线pdf查看
  13. 如何使用jQuery动态添加/删除文本框
  14. 统计检验的基本原理(异常值检验)
  15. 读书笔记 - 说话之道 - 2
  16. 生物特征识别六大技术,你知道多少?
  17. 业务流程再造和IT服务能力
  18. linux使用man守护进程,man手册的使用
  19. Enumeration
  20. HDMI协议介绍(六)--EDID

热门文章

  1. Jenkins中切换devtoolset
  2. 《MySQL——选错索引,该如何做》
  3. sml完整形式_411的完整形式是什么?
  4. CUL8R的完整形式是什么?
  5. Java PushbackInputStream markSupported()方法与示例
  6. js数字最多保留两位小数_8085微处理器中最多两个8位数字
  7. C/C++命令行参数那点事
  8. windows下 , py运用了 进程池, 将py打包成exe,出现错误的 解决思路之一
  9. libevent网络编程例子(1)
  10. 如何高效学习算法【实例 + 可视化】