栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

拦截器完成权限控制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

拦截器完成权限控制

如何通过拦截器完成权限控制 拦截器 概念

java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action
执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截
然后再之前或者之后加入某些操作。

实现方式
  • 第一步 定义注解
package com.alibaba.gov.kamala2.service.annotation;

import com.alibaba.gov.kamala2.enums.userrole.Kamala2LevelEnum;

import java.lang.annotation.*;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface AclUrlAutoHandle {
    
    String name();
    
    String value() default "";
    
    String code();

    
    Kamala2LevelEnum level() default Kamala2LevelEnum.LOW;

    
    boolean nodeFlg() default false;

    
    String description() default "系统添加的权限";
}
  • 第二步 定义拦截器类,该类实现HandlerInterceptor接口,并重写preHandle、postHandle、afterCompletion方法(如有需要);此处只需要重写preHandler即可;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@Component
public class MyInterceptor implements HandlerInterceptor {
 
 //注入上下文
	@Autowired
    private ApplicationContext applicationContext;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
      RequestMappingHandlerMapping rmhp = applicationContext.getBean(RequestMappingHandlerMapping.class);
        Map map = rmhp.getHandlerMethods();
        for(RequestMappingInfo info : map.keySet()){
            HandlerMethod hm=map.get(info);
            Method method = hm.getMethod();
           Object o = method.getAnnotation(AclUrlAutoHandle.class);
            if(o!= null){
                System.out.println(info.getPatternsCondition());
            }
        }
        return true;
    }
 
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception{
 
        System.out.println("解析视图之前.....");
    }
 
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                      Exception ex) throws Exception{
        System.out.println("视图解析完成...");
    }
}
  • 第三步:重写preHandler方法,在该方法体中获取含有自定义注解的url,并保存到set中;
@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
      RequestMappingHandlerMapping rmhp = applicationContext.getBean(RequestMappingHandlerMapping.class);
       Set set = new HashSet<>();
        Map map = rmhp.getHandlerMethods();
        for(RequestMappingInfo info : map.keySet()){
            HandlerMethod hm=map.get(info);
            Method method = hm.getMethod();
           Object o = method.getAnnotation(AclUrlAutoHandle.class);
            if(o!= null){
                System.out.println(info.getPatternsCondition());
                set.add(info.getPatternsCondition().toString());
            }
        }
        return true;
    }
  • 根据用户、角色、权限、授权记录四张表中的逻辑关系,来确定该用户是否有某一路径的权限(此处不做详细展开)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/322405.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号