Spring Boot 拦截器的使用

   java中拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作,一般拦截器方法都是通过动态代理的方式实现,可以通过它来进行权限验证,或者判断用户是否登录,访问日志等功能

第一步:创建一个类实现HandlerInterceptor接口,重写接口的方法,只是多了一个@Component注解,这个注解是为后面的使用时进行注入,已登录为例,代码如下:

package main.blog.interceptor;

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

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

import main.blog.entity.AdminBean;

@Component
public class LoginInterceptor implements HandlerInterceptor 
{
    //进入 Handler方法之前执行,比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
    {
        //判断session
        HttpSession  session = request.getSession();
        
        //从session中取出用户身份信息
        AdminBean admin = (AdminBean) session.getAttribute("admin");
        
        if(admin!=null)
        {
            return true;
        }
        
        //执行这里表示用户身份需要认证,跳转登陆页面
        response.sendRedirect(request.getContextPath()+"/admin/login");
        
        //false表示拦截,不向下执行,true表示放行
        return false;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
    }
}

第二步:创建一个类继承WebMvcConfigurer类并重写addInterceptors方法,springboot2中的,代码如下:

package main.blog.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfiguration implements WebMvcConfigurer {
    
    /**
     * 登录权限拦截器
     */
    @Autowired
    private LoginInterceptor loginInter;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) 
    {
        InterceptorRegistration loginRegistry = registry.addInterceptor(loginInter);
        
        //拦截以/admin/为前缀的 url路径
        loginRegistry.addPathPatterns("/admin/**");
        
        //可以通过的白名单请求地址
        loginRegistry.excludePathPatterns("/admin/login");
        loginRegistry.excludePathPatterns("/admin/captcha");
        loginRegistry.excludePathPatterns("/admin/dologin");
        
        //可以通过的白名单静态资源
        loginRegistry.excludePathPatterns("/admin/js/**");
        loginRegistry.excludePathPatterns("/admin/css/**");
        loginRegistry.excludePathPatterns("/admin/img/**");
        loginRegistry.excludePathPatterns("/admin/layui/**");
    }
}

到此拦截器的功能就实现啦

原文地址:https://www.cnblogs.com/huxiaoguang/p/10807750.html