SpringMVC 配置拦截器 HandlerInterceptor

目录

一、实现思路

二、具体实现

三、HandlerInterceptorAdapter 


一、实现思路

在 SpringMVC 或者 SSM 环境的项目下,新建一个拦截类,继承 HandlerInterceptor 接口,然后实现接口里面的三个方法,接着在 preHandle 方法里面编写拦截后的相关处理,然后在 springmvc 的配置中,将所有访问 controller 的链接给全都拦截下来就行。

注意:springmvc 配置拦截后,可能会把静态资源给拦截掉,这时候只需要把静态资源设置为不拦截就行,具体实现看下面。

二、具体实现

public class LoginInterceptor implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求的URL
        String url = request.getRequestURI();
        //URL:除了登录请求外,其他的URL都进行拦截控制
        if( url.indexOf("/login") >= 0 ){
            return true;
        }
        //获取 Session
        HttpSession session =request.getSession();
        TAdmin tadmin = (TAdmin)session.getAttribute("user");
        //判断Session中是否有用户数据,如果有,则返回true,继续想下执行
        if( tadmin != null ){
            return true;
        }
        //不符合条件的给出提示信息,并转发到登录页面
        request.getRequestDispatcher("/jsp/login/login.jsp").forward(request,response);
        return false;
    }

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

    }

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

    }
}

在 springmvc 的配置中添加下面的代码:

<!-- 5.配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/checkCode" />
        <mvc:exclude-mapping path="/getcookie" />
        <mvc:exclude-mapping path="/loginout" />
        <!-- 对静态资源不采取拦截 -->
        <mvc:exclude-mapping path="/**/*.js" />
        <mvc:exclude-mapping path="/**/*.css" />
        <mvc:exclude-mapping path="/**/*.png" />
        <mvc:exclude-mapping path="/**/*.gif" />
        <mvc:exclude-mapping path="/**/*.jpg" />
        <mvc:exclude-mapping path="/**/*.jpeg" />
        <mvc:exclude-mapping path="/**/iconfont.*" />
        <bean class="com.yyzheng.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

<mvc:mapping path="/**" />:拦截所有访问 controller 的路径 

<mvc:exclude-mapping path="/loginout" />:对不需要拦截的路径进行释放处理

bean :是指向到上面的 Java 类(LoginInterceptor)

至于静态资源的处理,根据自己项目所用到相关资源再进行修改。

三、HandlerInterceptorAdapter 

下面是另外一种写,继承的是 HandlerInterceptor 接口的实现类。配置的话是一样。

public class ShopLoginInterceptor extends HandlerInterceptorAdapter {
    /**
     * 主要做事前拦截,即用户操作发生前,改写 preHandle 里的逻辑,进行拦截
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //从session中取出用户信息
        Object userObj = request.getSession().getAttribute("user");
        if (userObj != null) {
            //若用户信息不为空,则将session里的用户信息转换成PersonInfo
            PersonInfo user = (PersonInfo) userObj;
            //做控制判断,确保userId不为空,并且该账号的可用状态为1,并且用户类型为店家
            if (user != null && user.getUserId() != null && user.getUserId() > 0 && user.getEnableStatus() == 1)
                //若通过验证则返回true,拦截器返回true之后,用户接下来的操作得以正常执行
                return true;
        }
        //若不满足登录验证,则直接跳转到账号登录页面
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<script>");
        out.println("window.open ('" + request.getContextPath() + "/local/login?usertype=2','_self')");
        out.println("</script>");
        out.println("</html>");
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/weidong_y/article/details/82793177