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;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(handlerMethod.getBeanType().isAnnotationPresent(Auth58.<span style="color: rgba(0, 0, 255, 1)">class</span>)){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注意要用handlerMethod.getBeanType()获得对象,不能通过getClass()获得对象</span>
        System.out.println("命中拦截器"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
        System.out.println(</span>"未命中拦截器"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    }

}

}

 
注意:要用 handlerMethod.getBeanType()获得对象,不能通过 getClass() 获得对象
解析注解属性值和进一步的判断方法这里就不写了,解析属性值的上面注解那篇里有介绍
单独业务逻辑各位就单独处理吧