自定义拦截器

拦截器原理

对于 Spring MVC 来说,拦截器的主要作用是拦截用户的请求并进行相应的处理,如权限验证等。

Interceptor 拦截器拦截请求通过实现 HandlerInterceptor 接口来完成。HandlerInterceptor 接口中有三个方法:

preHandle():该方法在请求处理之前被调用。它的返回值是一个 boolean 类型,若为 true,则继续调用后面的拦截器和目标方法,若为 false,则不会调用后面的拦截器和目标方法,表示请求结束。

postHandle():该方法只能在当前所属的 Interceptor 的 preHandle 方法返回值为 true 时才能调用,它在当前请求进行处理之后,即 Controller 方法被调用之后,视图被渲染之前执行。

afterCompletion():该方法只能在当前所属的 Interceptor 的 preHandle 方法返回值为 true 时才能调用,它在整个请求结束之后,即视图被渲染之后执行,其主要作用是进行资源清理。

注:在 Spring MVC 中,一个请求可以添加多个拦截器 Interceptor,每个 Interceptor 的调用会根据声明顺序依次执行。最先执行的是 preHandle 方法, postHandle 方法的被调用的方向和 preHandle 相反。

image.png

web.xml

    配置拦截器
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/*"/>
      自定义拦截器类
            <bean class="com.Interceptor.LoginInterceptor"></bean>  
        </mvc:interceptor>
    </mvc:interceptors>


自定义拦截类



package com.Interceptor;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginInterceptor implements HandlerInterceptor {
    private static final String[] IGNORE_URI = { "/login" };



    //该方法在controller处理前调用
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
          System.out.println("This is preHandle!");
            // flag 表示是否登录
            boolean flag = false;
            // 获取请求的 URL
            String url = request.getServletPath();
            for (String s : IGNORE_URI) {
                if (url.contains(s)) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
       
                // 获取 Session 并判断是否登录 
                String username = (String) request.getSession().getAttribute(
                        "username");
                if (username == null) {
                    request.setAttribute("message", "Please log in first!");
                    System.out.println("------");
                    // 如果未登录,进行拦截,跳转到登录界面
                    request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
                            .forward(request, response);
                } else {
                
                    flag = true;
                }
            }
            return flag;
       }




    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub
        
    }
    
    
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub
        
    }



}