SpringMVC+自定义注解实现注解拦截器

目的:通过注解标注该请求需要进行拦截

1.自定义注解:

    创建名为LoginInterceptor的注解

//生成javadoc时会包含注解
@Documented
//作用域
@Target(
        { ElementType.METHOD, ElementType.TYPE })
//生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginInterceptor {
    public String url() default "";
    //可以随便写参数,在使用时调用
}

    关于作用域:METHOD就是方法,TYPE表示类,申明该注解即可用在方法上,也可以用在类上。

    至于注解里的变量:就是注解附带的信息,可以没有变量,如果有变量并且没有默认值(default)的时候,使用注解就必须赋值。

2.实现SpringMVC的拦截效果:

    创建拦截器的类继承HandlerInterceptorAdapter(此时我们只想做前置拦截,就不实现HandlerInterceptor接口了,用适配器就好了)

 
public class LoginCheckController extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        boolean flag = false;
        //通过handler请求的方法再获取被请求的方法上的LoginInterceptor注解
        LoginInterceptor loginInterceptor = ((HandlerMethod)handler).getMethodAnnotation(LoginInterceptor.class);
        //判断是否有LoginInterceptor注解
        if(null == loginInterceptor){//没有注解表明该请求不需要被拦截直接返回true
            flag = true;
        }else {//有注解说明我们需要进行登录验证的处理
            HttpSession session = request.getSession();
            User user  = (User)session.getAttribute("OFMUser");
            if (null != user){//如果有session说明用户已经登陆返回值设置为true
                flag = true;
            }
        }
        if (flag == false){//说明用户此时没有登录,跳转到登录页面
            loginInterceptor.url();//此处表示我们可以获取的到我们使用直接时传递的参数(只是为了证明我们可以获取使用注解时传递的参数,在当前程序里没有实际作用)
            response.sendRedirect(request.getContextPath()+"/page/login");
        }
        return  flag;
    }

}

在SpringMVC的配置文件中添加

  <!--拦截器-->
    <mvc:interceptors>
        <!-- 多个拦截器,顺序执行 -->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!--被排除拦截的资源-->
            <mvc:exclude-mapping path="/css/**"/>
            <mvc:exclude-mapping path="/fonts/**"/>
            <mvc:exclude-mapping path="/images/**"/>
            <mvc:exclude-mapping path="/img/**"/>
            <mvc:exclude-mapping path="/js/**"/>
            <mvc:exclude-mapping path="/sass/**"/>
            <bean class="com.sakura.controller.LoginCheckController"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

在后面用<bean>申明我们创建的拦截器的类

最后在我们需要被拦截的请求上添加注解:

    @LoginInterceptor(url = "login")
    @RequestMapping("/text")
    public ModelAndView toText(){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("text");
        return mv;
    }

此处的url=“login”,就相当于给注解的url赋值 可以在拦截器中通过 注解对象.变量名获取。上面的代码有写出

自此我们就可以再需要被拦截的请求加上注解就可以实现拦截效果了。

  




  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值