springboot_使用自定义注解+拦截器实现权限控制

这里只是一个简单的例子,表示只有管理员才可以进行删除功能。

一、自定义注解

我们自定义一个注解,该注解注解到需要拦截的url对应的方法上

package com.rong.crud.self;

import java.lang.annotation.*;

//说明该注解将被包含在javadoc中
@Documented
//可以在方法和类上使用注解
@Target({ElementType.METHOD,ElementType.TYPE})
// 定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。
@Retention(RetentionPolicy.RUNTIME)
// 子类可以继承父类中的该注解
@Inherited
public @interface MyAnnotation {

}

二、注解到对应的方法上

因为我们要对删除功能进行拦截,所以注解在这个功能上面

    /**
     * 删除
     * @param id
     * @return
     */
    @MyAnnotation
    @RequestMapping("/student/delete")
    public String delete(@RequestParam("id") Integer id){
        studentService.deleteStudent(id);
        return "redirect:/index";
    }

三、自定义拦截器

package com.rong.crud.interceptor;


import com.rong.crud.bean.User;
import com.rong.crud.self.MyAnnotation;
import org.springframework.ui.Model;
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;

/**
 * 自定义拦截器
 */
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器");
        //获得名为user的对象
        Object user = request.getSession().getAttribute("user");
        //判断请求的方法上是否有注解
        boolean haveAnnotataion = handler.getClass().isAssignableFrom(HandlerMethod.class);

        if(haveAnnotataion){
            //如果有注解,判断是否是MyAnnotation
            MyAnnotation ma = ((HandlerMethod)handler).getMethodAnnotation(MyAnnotation.class);
            //如果存在该注解
            if(ma != null) {
                //判断用户名是否是admin(这里把用户名为admind的用户当作管理员)
                if(!((User)user).getName().equals("admin")){
                    //如果不是转发到/index上
                    request.setAttribute("msg","你未有权限!");
                    request.getRequestDispatcher("/index").forward(request,response);
                    return false;
                }
            }
        }

        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 {
    }
}

这里我是转发到了/index上,可以参考一下,实际上你需要怎么实现你就怎么写

  @RequestMapping("/index")
    public String index(Model model, HttpServletRequest request) {
        String msg =(String)request.getAttribute("msg");
        List<Student> studentList = studentService.selectAllStudent();
        model.addAttribute("studentList", studentList);
        model.addAttribute("msg",msg);
        return "index";
    }

拦截器配置类,指定拦截哪种请求

package com.rong.crud.config;

import com.rong.crud.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器配置类
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截器
        InterceptorRegistration ir = registry.addInterceptor(new MyInterceptor());

        //添加拦截请求
        ir.addPathPatterns("/student/*");

        //添加不拦截的请求
       ir.excludePathPatterns("/student/addOrUpdate");

      
    }
}

四、实现图解

我们先以管理员的身份登录(页面写的简单):删除时就直接删除了

我们以普通用户的身份登录(这里就省略登录部分了),这是就会看到没有权限使用删除了。

本文参考了以下博文:https://blog.csdn.net/sunnyzyq/article/details/95348788

发布了60 篇原创文章 · 获赞 10 · 访问量 9183

猜你喜欢

转载自blog.csdn.net/chaseqrr/article/details/104391745