springboot拦截器/过滤器,使用自定义注解简化拦截器校验范围配置。

做一个简单的springboot拦截器,登录校验。首先需要有一个用来判断是否拦截的根据,那么既然是登录消炎,就用登陆成功后存入session域的loginUser,

   @RequestMapping(value="/login",method = RequestMethod.POST)
    public   String  login(Model model,User user){
        User loginUser = userservice.login(user);
       session.setAttribute("loginUser",loginUser);
        return "redirect:list";

    }

创建login拦截器


@Component   
public class LoginInterceptor  extends HandlerInterceptorAdapter {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {


        //登录校验
        //1.从session中或去loginUser, 判断是否登录过的依据-->loginUser
        User loginUser = (User)request.getSession().getAttribute("loginUser");
        //2.如果loginUser为null,跳转登录
        if (loginUser == null){
            //重定向到登录页面
            response.sendRedirect("toLogin");
            //种植请求处理
            return false;
        }
        //3.说明登陆过,将请求交给controller处理
        return true;
    }

}

下面代码是config包下的MyWebMvcConfigurer : 配置拦截器

@Configuration    //所有的配置类都要在config包下,并增加@Configuration注解
public class MyWebMvcConfigurer  implements WebMvcConfigurer {

    //对于springMvc的自定义的配置都需要通过WebMvcConfigurer接口实现
    //配置拦截器需要
    //1. 注入需要配置的拦截器对象
    //2.实现addInterceptors方法,进行配置
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)    //指定需要配置的拦截器
                .addPathPatterns("/**") //指定需要拦截的请求  /**  表示拦截所有
                .excludePathPatterns("/list")  //指定需要排除的请求
               .excludePathPatterns("/login")
                .excludePathPatterns("/toLogin")
                .excludePathPatterns("/toRegister")
                .excludePathPatterns("/*.html");



    }
}

下面是使用自定义注解简化拦截器校验范围配置

在annotation包下的自定义注解配置


import java.lang.annotation.*;

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedLogin {


    // 自定义 NeedLogin 注解,标识需要登录校验的方法
    /**
     * 自定义注解需要增加 @Target 和 @Retention 注解
     *      @Target 设置注解的使用范围
     *          TYPE        类
     *          FIELD       属性
     *          METHOD      方法
     *          PARAMETER   参数
     *
     *     @Retention 设置注解的有效范围
     *          SOURCE      编码
     *          CLASS       编译
     *          RUNTIME     运行
     */

}

哪个方法需要拦截,就为其添加注解 @NeedLogin

 @NeedLogin
    @RequestMapping(value="/edit",method = RequestMethod.GET)
    public   String  edit(Model model,Integer id){
       User user =  userservice.getById(id);
        model.addAttribute("user",user);
        return "edit";

    }

MyWebMvcConfigurer类,只保留其中的拦截所有请求语句

@Configuration    //所有的配置类都要在config包下,并增加@Configuration注解
public class MyWebMvcConfigurer  implements WebMvcConfigurer {

    //对于springMvc的自定义的配置都需要通过WebMvcConfigurer接口实现
    //配置拦截器需要
    //1. 注入需要配置的拦截器对象
    //2.实现addInterceptors方法,进行配置
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)    //指定需要配置的拦截器
                .addPathPatterns("/**");  //指定需要拦截的请求  /**  表示拦截所有
//                .excludePathPatterns("/list")  //指定需要排除的请求
//                .excludePathPatterns("/login")
//                .excludePathPatterns("/toLogin")
//                .excludePathPatterns("/toRegister")
//                .excludePathPatterns("/*.html");



    }
}

LoginInterceptor类添加语句判断有无 @NeedLogin 注解


@Component
public class LoginInterceptor  extends HandlerInterceptorAdapter {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 根据hander 是否有 NeedLogin 注解来决定是否进行登录校验

        if (handler instanceof  HandlerMethod   //先判断是不是controller中的方法
                &&((HandlerMethod)handler).getMethodAnnotation(NeedLogin.class)== null){  //再判断是不是@NeedLogin的注解
            //如果获取不到 NeedLogin注解,说明该方法没有被注解标识,说明不需要进行登录校验。
            return true;
        }

        //登录校验
        //1.从session中或去loginUser, 判断是否登录过的依据-->loginUser
        User loginUser = (User)request.getSession().getAttribute("loginUser");
        //2.如果loginUser为null,跳转登录
        if (loginUser == null){
            //重定向到登录页面
            response.sendRedirect("toLogin");
            //种植请求处理
            return false;
        }
        //3.说明登陆过,将请求交给controller处理
        return true;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值