zoukankan      html  css  js  c++  java
  • Java拦截器+注解搭配使用

    拦截器加注解可以实现登录权限验证等操作,我的应用场景也是为了验证这个,下面是简单的实现步骤
     

    一、什么是拦截器?

    拦截器是对action的一种拦截,可以在请求前后进行一些处理
    可拦截controller和view内容
     

    二、Spring中自定义拦截器步骤

     
    1、Spring中继承HandlerInterceptorAdapter或实现HandlerInterceptor接口
    public class Auth58Interceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            return true;
        }
    }
     
    2、重写preHandler等方法
    HandlerInterceptorAdapter下的有几个方法分别处理拦截请求的操作前后的内容,可根据自己需要选择方法重写
     
    业务处理请求之前:preHandle
    该方法返回boolean类型值,如果为true继续下面的内容,为false直接退出该请求,不会继续执行了
    preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
     
    业务处理请求之后,DispatcherServlet渲染ModelAndView视图之前:postHandle
    preHandle返回true时才会执行这里
    postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
     
    业务处理请求之后,DispatcherServlet渲染了ModelAndView视图之后:afterCompletion
    preHandle返回true时才会执行这里
    afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
     
    有异步请求时触发:afterConcurrentHandlingStarted
    在preHandle返回true之后才执行这里,这里执行完成之后会触发postHandle和afterCompletion
    afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
     
    3、在web.xml中注册拦截器
    可以设置多个interceptor拦截器,从上至下进行匹配拦截
    mvc:mapping path="":匹配那种路径可以命中拦截器,如果不配置或配置/**将会拦截所有Controller
    mvc:exclude-mapping path="":排除该路径不进行拦截,静态资源进行拦截我这里会出问题,所以排除掉
    bean class="":拦截器的类,包含包名的全路径
     
    例子如下:
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" /><!--如果不配置或/**,将拦截所有的Controller-->
            <mvc:exclude-mapping path="/static/**" />
            <mvc:exclude-mapping path="/views/**" />
            <bean class="com.zhuanzhuan.zzappqa.annotations.Auth58Interceptor" />
        </mvc:interceptor>
    </mvc:interceptors>
     

    三、拦截器和注解配合使用

    自定义注解的方式详见:http://www.cnblogs.com/meitian/p/9048331.html
     
    我这里用途是,判断接口需要的权限,进而查看当前用户是否有访问全新
     
    步骤1:拦截器重新preHandler()方法,解析自定义注解上的属性值
    步骤2:获得当前请求信息中的用户信息,从数据库中拿到当前登录用户的权限
    步骤3:通过步骤2获得当前用户权限和步骤1中限定的权限作对比,判断是否允许继续访问或是跳转到登录等其他操作
     
    一个未处理逻辑的例子如下:
    拦截器代码:
    package com.xxx.annotations;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.lang.annotation.Annotation;
     
    public class Auth58Interceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
     
            if(handlerMethod.getBeanType().isAnnotationPresent(Auth58.class)){//注意要用handlerMethod.getBeanType()获得对象,不能通过getClass()获得对象
                System.out.println("命中拦截器");
                return true;
            }else{
                System.out.println("未命中拦截器");
                return true;
            }
     
        }
    }
     
    注意:要用handlerMethod.getBeanType()获得对象,不能通过getClass()获得对象
    解析注解属性值和进一步的判断方法这里就不写了,解析属性值的上面注解那篇里有介绍
    单独业务逻辑各位就单独处理吧
     
     
     
     
     
     
  • 相关阅读:
    .Maven的工程类型有哪些?
    .Maven仓库是什么
    什么是Maven?
    .request.getAttribute()和 request.getParameter()有何区别?
    .什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
    .window.onload()函数和jQuery中的document.ready()有什么区别?
    get和post的区别?
    Maven常用命令有哪些?
    物质待遇和工作条件是人们选择工作的重要因素之一,这次报考谈一谈你在选择工作时都考虑哪些因素?为什么?
    你最大的长处和弱点分别是什么?这些长处和弱点对你在企业的业绩会有什么样的影响?
  • 原文地址:https://www.cnblogs.com/meitian/p/9078994.html
Copyright © 2011-2022 走看看