Spring MVC基础知识整理➣拦截器和自定义注解
概述
Spring MVC中通过注解来对方法或者类进行动态的说明或者标注,类似于配置标识文件的属性信息。当标注的类或者方式被使用时候,通过提取注解信息来达到对类的动态处理。在 MVC中,我们常用的注解@Controller、 @RequestMapping等,通过设置注解里面的方法值来实现不同数据的处理方式。
如@RequestMapping(value="/City",method=RequestMethod.GET),我们标注请求映射地址和请求的方式;通过解读这些属性信息,来实现内部不通的处理方式。
自定义注解
新建Annotation(注解),实例代码如下
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented //输出文档格式化 @Inherited @Target(ElementType.METHOD) //这是一个对方法的注解,还可以是包、类、变量等很多东西 @Retention(RetentionPolicy.RUNTIME)//保留时间,一般注解就是为了框架开发时代替配置文件使用,JVM运行时用反射取参数处理,所以一般都为RUNTIME类型 public @interface AuthPassport { //是否启用验证信息 boolean validate() default true; //权限等级编码 String PowerCode() default "admin"; }
添加方法的注释类
public class HelloWorldController
{
@AuthPassport(validate=true,PowerCode="EveryOne") @RequestMapping(value={"/*","/say"},method=RequestMethod.GET) public ModelAndView China() { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", "Hello World!"); modelAndView.setViewName("HelloWorld/CIndex"); return modelAndView; }
}
获取注解类信息
import java.lang.reflect.Method; public class TestThis { public static void main(String[] args) throws Exception { // 提取到被注解的方法Method,这里用到了反射的知识 Method method = Class.forName("HelloWorldController").getDeclaredMethod("China"); // 从Method方法中通过方法getAnnotation获得我们设置的注解 AuthPassport oneAnnotation = method.getAnnotation(AuthPassport.class); // 得到注解的俩参数 System.out.println(oneAnnotation.validate()); System.out.println(oneAnnotation.PowerCode()); } }
拦截器
针对MVC的数据请求,我们可以配置响应的Bean(拦截器)进行数据拦截,自定义拦截器需要继承HandlerInterceptorAdapter类,重写该类的三个方法(preHandle、postHandle、afterCompletion),其中afterCompletion响应之后触发的方法,preHandler响应之前处理方法,postHandle是标识响应中触发的方法。我们可以在preHandler里面进行数据的校验,比如权限的校验、登录信息的校验等信息的处理。HandlerInterceptorAdapter的源码:
public interface HandlerInterceptor { boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
自定义拦截器如下
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import justin.com.comclass.AuthPassport; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class AuthInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if(handler.getClass().isAssignableFrom(HandlerMethod.class)) { AuthPassport authpassport=((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class);//使用自定义注解 if(authpassport==null || authpassport.validate()==false) { return true; } else { System.out.println("测试注解"); boolean IsValieData=request.isRequestedSessionIdValid(); //在这里实现自己的权限验证逻辑 if(!IsValieData)//如果验证成功返回true(这里直接写false来模拟验证失败的处理) return true; else//如果验证失败 { //返回到登录界面 response.sendRedirect("../login/index"); return false; } } } else { return true; } } }
在spring-servletconfig.xml 中配置拦截器信息
<mvc:interceptors> <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 --> <bean class="justin.com.fileter.AuthInterceptor"></bean> </mvc:interceptors>
至此MVC自定义的拦截器整理完毕!