SpringBoot配置拦截器

1、创建一个加载自定义拦截器类

  • 主要是用来加载自定义的拦截器类
  • 拦截器配置类(类似于以前spring里的xml配置):实现WebMvcConfigurer 接口
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 *  拦截器配置类(类似于以前spring里的xml配置)
 */
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
    
    //登录拦截器类
    @Autowired
    private MyInterceptor myInterceptor;

    //权限拦截器类
    @Autowired
    private PermissionInterceptor permissionInterceptor;

    //实现拦截器 要拦截的路径以及不拦截的路径
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        /*
            addInterceptor():添加自定义的拦截器
            addPathPatterns(): 需要拦截的路径
            excludePathPatterns(可变参数):需要放行的路径  
            	     参数2的这个 / :这一根斜杠表示的是static(静态资源)下的assets文件夹下的所以静态资源放行

        */
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login","/assets/**","/nopermission");
        registry.addInterceptor(permissionInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login","/assets/**","/nopermission");
    }
}

2、自定义拦截器(登录)

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

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

/**
 * 登录拦截器类
 */
@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //判断session里面是否存储的有登录信息
        Employee employee =(Employee)request.getSession().getAttribute("USER_IN_LONGIN");

        //如果没有存储就跳转到登录界面
        if(employee==null){
            response.sendRedirect("/login");
            return false;
        }
		// true:放行   false:拦截
        return true;
    }
}

3、自定义拦截器(授权)

  • 注意:这里的代码本人是写给自己看的,如果阁下使用后出现什么掉头发行为,在下也没办法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@Component
public class PermissionInterceptor implements HandlerInterceptor {

    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        //获取到操做数据的请求路径
        String uri = request.getRequestURI();

        //1.得到所有Permission权限里面的资源路径
        List<String> list = permissionMapper.findUrlAll();

        //2.判断当前的请求路径是否在permissio这张表里的url里面
        if(!list.contains(uri)){ //如果包含,返回的是true
            //注意:这里面表示不包含,那么就是公共资源,就进行放行
            return true;
        }else {
            //3.如果包含,那么就判断当前登录用户是否有这个资源路径
            Employee employee =(Employee)request.getSession().getAttribute("USER_IN_LONGIN");
            //根据当前登录用户查询到对应的权限资源url
            List<String> employeeUrls = employeeMapper.findPermissionUrlByEmployee(employee);

            //4.判断当前登录用户里面是否包含当前请求的url
            if(employeeUrls.contains(uri)){
                //这里如果包含,那么就表示有这个权限,那么就放行
                return true;
            }else {
                //5.不包含(没权限)
                //①.获取到ajax的请求头(如果这个请求头存在,那么他就是一个ajax请求:添加、保存、删除 ..等等)
                String header = request.getHeader("Content-Type");
                //②.判断这个请求头是否为空
                if(header!=null){
                    response.setHeader("content-type", "text/html;charset=utf-8");
                    response.setHeader("Content-Type", "application/json");
                    response.getWriter().print("{\"success\" : true,\"msg\" : \"暂无权限\"}");
                }else {
                    //6、普通请求就跳转没有权限界面
                    //如果不包含这个权限,那么就表示权限不够,那么就进行拦截,并跳到没有权限的界面
                    response.sendRedirect("/nopermission");
                }
                return false;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值