使用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";
    }

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

猜你喜欢

转载自blog.csdn.net/weixin_38323645/article/details/108742646