实现登陆验证的第二种方式:Interceptor
还是直接用例子来说明吧
1)定义一个拦截器,拦截器必须实现HandlerInterceptor接口,并且实现接口中的方法
拦截器:LoginInterceptor.java
/**
* 自定义登陆拦截器
* @author hetiantian
* @version 2017/11/6.
*/
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//根据用户是否有登录账号进行拦截
//如果有,则跳转到需要进行验证的控制层中,否则需要登录
Object administrator = httpServletRequest.getSession().getAttribute("loginAccount");
if (administrator == null) {
System.out.println("尚未登陆,跳转到登录页面");
httpServletResponse.sendRedirect("/login.html");
return false;
}
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterComplete");
}
}
对HandlerInterceptor接口中的方法进行详细说明
1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法。该方法在请求处理前进行调用。SprigMVC中的Interceptor的调用都是链式的,在一个应用中或者在一个请求中可以同时存在多个interceptor,每个interceptor的调用会根据它的声明顺序依次执行,而且最先执行的都是interceptor的preHandle方法,所以可以在这个方法中进行一些初始化操作或者对当前的请求进行一个预处理,也可以在这个方法中进行一些判断来决定请求是否继续执行下去,如果该方法返回false,表示请求结束,后续的interceptor和Controller都不会在继续执行。当返回true时,会调用下一个interceptor的preHandle()方法,如果是最后一个interceptor时,就会调用当前请求的Controller方法
2 )postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法。该方法在当前对应的interceptor的preHandle方法的返回值为true时才会执行 ,在controller方法调用执行之后,在dispatcher进行视图返回渲染之前被调用。所以可以在这个方法中对controller处理后的modelview对象进行操作。。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2 里面的Interceptor 的执行过程有点类型。Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用ActionInvocation 的invoke 方法来触发对下一个Interceptor 或者是Action 的调用,然后每一个Interceptor 中在invoke 方法调用之前的内容都是按照声明顺序执行的,而invoke 方法之后的内容就是反向的。
3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法。该方法在当前对应的interceptor的preHandle方法的返回值为true时才会执行,该方法在整个请求结束以后才会执行,也就是在DispatcherServlet 渲染了对应的视图之后执行。该方法的主要作用是用于资源的清理。类似与Filter中的destroy()方法
2)在spring配置文件中配置拦截的url
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/administrator/**"/>
<bean class="com.cqupt.myproject.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
使用<mvc:interceptors>标签来声明需要加入到springmvc拦截器链中的拦截器
<mvc:mapping path=""/>指定拦截的url
<bean>指定使用哪个拦截器