SpringMvc 拦截器 对未登录系统的操作进行拦截处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HSH205572/article/details/83858357

各类拦截器的传统写法案例:

1 在spring-mvc.xml 文件中添加 拦截器 如下:

<!-- 通用拦截器配置 -->
<mvc:interceptors>
    ...
    ...
    <mvc:interceptor>
        <mvc:mapping path="/data/**"/>
        <bean class="com.icinfo.system.interceptor.NotLoggedInToIntercept"/>
    </mvc:interceptor>
</mvc:interceptors>

2  拦截器类编写如下:

package com.icinfo.system.interceptor;

import com.icinfo.support.constants.Constants;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 描述 未登录认证访问拦截
 *
 * @author 
 * @date 2018/11/8 
 */
public class NotLoggedInToIntercept implements HandlerInterceptor {
    //登录页地址
    private static final String loginUrl = "/";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
        HttpSession session = request.getSession(false);
        if (session == null || !request.isRequestedSessionIdValid()) {
            response.sendRedirect(request.getContextPath() + loginUrl);
            return false;
        }

        //获取登录用户信息
        Object object = session.getAttribute(Constants.SESSION_LOG_KEY);
        if (object == null) {
            response.sendRedirect(request.getContextPath() + loginUrl);
            return false;
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {

    }
}

拦截器: 就是对请求进行拦截,做一些预处理、后处理或返回处理的操作 。

Spring MVC中使用拦截器的方法,也可继承HandlerInterceptorAdapter类,并根据需求实现其中的preHandle方法(预处理)、postHandle方法(返回处理),afterCompletion方法(后处理)。

下面重点说下preHandler方法:

当请求来的时候,先经过applyPreHandle,内部会按顺序获取所有的拦截器,并依次拦截

当进入拦截器链中的某个拦截器,并执行preHandle方法后

1.当preHandle方法返回false时,从当前拦截器往回执行所有拦截器的afterCompletion方法,再退出拦截器链。也就是说,请求不继续往下传了,直接沿着来的链往回跑。

2.当preHandle方法全为true时,执行下一个拦截器,直到所有拦截器执行完。再运行被拦截的Controller。然后进入拦截器链,运行所有拦截器的postHandle方法,完后从最后一个拦截器往回执行所有拦截器的afterCompletion方法.

猜你喜欢

转载自blog.csdn.net/HSH205572/article/details/83858357