使用Java注解配合过滤器实现权限控制

先定义一个过滤器 Filter 实现 HandlerInterceptor 接口。

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class Filter implements HandlerInterceptor {
 
    /**
     * 在业务处理器处理请求之前被调用
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("aaaaaa进来了");
        // 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller。
        // 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出。
        return true;
    }
 
    /**
     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作
     */
    @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 {
    }
 
}

三个方法的执行顺序:preHandle —》 postHandle —》afterCompletion 。

然后再创建一个 WebAppConfigurer 类实现 WebMvcConfigurer 接口。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器,可添加多个
        // addPathPatterns("/**") 设置拦截哪些请求,/** 拦截所有请求
        registry.addInterceptor(new Filter()).addPathPatterns("/**");
    }
}

启动项目,随便发一个请求,看控制台输出。
在这里插入图片描述

Java注解:
定义一个注解:

 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AuthPower {
    String value() default "";
}

在这里插入图片描述

实现权限控制:

/**
     * 在业务处理器处理请求之前被调用
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = null;
        // HandlerMethod封装了很多属性,在访问请求方法的时候可以访问到方法、方法参数、方法上的注解等信息。
        if (handler instanceof HandlerMethod) {
            handlerMethod = (HandlerMethod) handler;
        } else {
            return true;
        }
        Method method = handlerMethod.getMethod();
        // 返回指定类型的注解对象
        AuthPower authPower = method.getAnnotation(AuthPower.class);
        // 方法上没有该类型的注解,返回null
        if(authPower != null) {
            HttpSession session = request.getSession();
            String urlss = request.getRequestURI();
            String url = "".equals(authPower.value()) ? urlss.substring(request.getContextPath().length()) : authPower.value();
            // url 不符合数据库存的,可以另外进行处理。
            System.out.println("路径:" + url);
 
            // 然后获取登陆用户
            User user = (User)session.getAttribute("user");
            if (user == null) {
                // 没登陆,重定向到登陆页面
                //response.sendRedirect("login.jsp");
                //return false;
            }
 
            // 登陆时把用户的所有权限查出来,这里测试,我就直接new 一个 List 了。
            List<String> list = new ArrayList<>();
            list.add("/home");
            if(list.contains(url)) {
                System.out.println("该用户有权限访问。。。开心!");
                return true;
            }else{
                System.out.println("该用户没有权限访问。。。难过!");
                return false;
            }
        }
        return true;
    }

方法上加上注解:

**
     * 登陆成功页面
     * @return
     */
    @RequestMapping("home")
    @AuthPower
    public String home(){
        return  hrPath+"home";
    }
 
    /**
     * 首页面
     * @return
     */
    @RequestMapping("homePage")
    @AuthPower
    public String homePage(){
        return  hrPath+"homePage";
    }

分别访问这两个路径,看控制台输出:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值