Interceptor登录拦截(Spring拦截器)

来源:互联网 发布:复杂网络建模基本概念 编辑:程序博客网 时间:2024/05/17 16:44

Interceptor登录拦截

拦截器HandlerInterceptor接口有三个回调方法
1.preHandle方法,顾名思义,该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。

2.postHandle方法,由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。
3.afterCompletion方法,该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

执行先后顺序:pre,post,after

package com.cn.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class LoginInterceptor implements HandlerInterceptor{    //拦截"/addGoods"和"/login"请求      private static final String[] IGNORE_URI = {"addGoods","login"};    @Override    public void afterCompletion(HttpServletRequest arg0,            HttpServletResponse arg1, Object arg2, Exception arg3)            throws Exception {        System.out.println("拦截器after");    }    @Override    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,            Object arg2, ModelAndView arg3) throws Exception {        System.out.println("拦截器post");    }    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,            Object arg2) throws Exception {        System.out.println("拦截器pre");        //flag变量用于判断用户是否登录,默认为false         boolean flag = true;         //获取请求的路径进行判断(@control的路径,如"/fore/addGoods")        String servletPath = request.getServletPath();            //判断请求是否需要拦截        for (String s : IGNORE_URI) {          if (servletPath.contains(s)) {            flag = false;            break;          }        }        //拦截请求        if (!flag) {          //1.获取session中的用户             String name = (String)request.getSession().getAttribute("name");          //2.判断用户是否已经登录           if(name == null) {    //验证还未登录,跳转至登录界面         response.sendRedirect("foregroundProgram/main.jsp");          } else {            //如果用户已经登录,则验证通过,放行             System.out.println("AuthorizationInterceptor放行请求:");             flag = true;          }        }        return flag;        }}

springMVC-servlet配置

<mvc:interceptors>  <mvc:interceptor>  <!--两个星号-->    <mvc:mapping path="/**"/>    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求,此为自定义拦截器的路径 -->    <bean class="com.cn.action.LoginInterceptor"/>  </mvc:interceptor>    </mvc:interceptors>