springboot中如何配置拦截器

1.编写拦截器SqlMapInterceptor 实现 HandlerInterceptor 接口

package com.meishi.core.interceptor;

import com.github.ag.core.context.BaseContextHandler;
import com.google.common.collect.Lists;
import com.meishi.core.enums.DataRangeEnum;
import com.meishi.security.api.service.IUserDepartIdsFeignApi;
import com.meishi.security.api.service.IUserFeignApi;
import com.meishi.security.api.service.IUserGroupDataRangeFeignApi;
import com.meishi.security.api.vo.user.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public class SqlMapInterceptor implements HandlerInterceptor {


    @Autowired
    private IUserDepartIdsFeignApi userDepartIdsFeignApi;
    @Autowired
    private IUserGroupDataRangeFeignApi userGroupDataRangeFeignApi;
    @Autowired
    private IUserFeignApi userFeignApi;

    //定义一个线程域,存放拼接的sqlMap,解决线程安全问题
    private static final ThreadLocal<HashMap<String, String>> TL = new ThreadLocal<>();


    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

        StringBuilder sql = new StringBuilder();
        HashMap<String, String> sqlMap = new HashMap<>();
        String tenantId = BaseContextHandler.getTenantID();
        String userID = BaseContextHandler.getUserID();

        //查询用户所在组的数据权限,有多个角色权限时取最大权限
        if (userID != null) {
            List<String> userGroupDataRange;
            String finalUserGroupDataRange;
            try {
                userGroupDataRange = userGroupDataRangeFeignApi.getUserGroupDataRange(userID);
                if (userGroupDataRange.contains(DataRangeEnum.ALL_DATA.getValue())) {
                    finalUserGroupDataRange = DataRangeEnum.ALL_DATA.getValue();
                } else if (userGroupDataRange.contains(DataRangeEnum.DEPART.getValue())) {
                    finalUserGroupDataRange = DataRangeEnum.DEPART.getValue();
                } else {
                    finalUserGroupDataRange = DataRangeEnum.PERSONAL.getValue();
                }
            } catch (Exception e) {
                log.error("用户组数据范围获取异常!", e);
                return false;
            }
            UserInfo user = userFeignApi.getUserById(userID);
            List<UserInfo> subordinateList = Lists.newArrayList();
            List<String> subordinateIds = Lists.newArrayList();
            if (user.getNo() != null) {
                subordinateList = userGroupDataRangeFeignApi.getSubordinate(user.getNo());
            }
            if (!CollectionUtils.isEmpty(subordinateList)) {
                subordinateIds = subordinateList.stream().map(UserInfo::getId).collect(Collectors.toList());
            }

            //如果所在组的数据范围为空,或者范围为“仅本人”,查看本人数据及下级数据
            if (finalUserGroupDataRange == null || finalUserGroupDataRange.equals(DataRangeEnum.PERSONAL.getValue())) {
                subordinateIds.add(userID);
                StringBuilder subordinateSql = new StringBuilder();
                for (int i = 0; i < subordinateIds.size(); i++) {
                    if (i != (subordinateIds.size() - 1)) {
                        subordinateSql.append("'").append(subordinateIds.get(i)).append("',");
                    } else {
                        subordinateSql.append("'").append(subordinateIds.get(i)).append("'");
                    }
                }
                sql.append(" a.crt_user_id in (").append(subordinateSql).append(") ");
                sqlMap.put("dataFiltering", sql.toString());
                TL.set(sqlMap);
                return true;
            } else if (finalUserGroupDataRange.equals(DataRangeEnum.DEPART.getValue())) {  //如果数据范围为“按部门”,查询该用户相关的部门数据
                try {
                    List<String> departIds = userDepartIdsFeignApi.getUserDepartIds(userID);
                    if (departIds != null && departIds.size() > 0) {
                        StringBuilder departSql = new StringBuilder();
                        for (int i = 0; i < departIds.size(); i++) {
                            if (i != (departIds.size() - 1)) {
                                departSql.append("'").append(departIds.get(i)).append("',");
                            } else {
                                departSql.append("'").append(departIds.get(i)).append("'");
                            }
                        }
                        sql.append(" a.depart_id in (").append(departSql).append(") ");
                    }
                    sqlMap.put("dataFiltering", sql.toString());
                    TL.set(sqlMap);
                    return true;
                } catch (Exception e) {
                    log.error("部门ids获取异常!", e);
                    return false;
                }
            } else if (finalUserGroupDataRange.equals(DataRangeEnum.ALL_DATA.getValue())) {  //如果数据范围为“所有数据”,查询本公司所有数据
                sql.append(" a.tenant_id = '").append(tenantId).append("'");
                sqlMap.put("dataFiltering", sql.toString());
                TL.set(sqlMap);
                return true;
            } else { //其它情况,默认只查本人数据及下级数据
                subordinateIds.add(userID);
                StringBuilder subordinateSql = new StringBuilder();
                for (int i = 0; i < subordinateIds.size(); i++) {
                    if (i != (subordinateIds.size() - 1)) {
                        subordinateSql.append("'").append(subordinateIds.get(i)).append("',");
                    } else {
                        subordinateSql.append("'").append(subordinateIds.get(i)).append("'");
                    }
                }
                sql.append(" a.crt_user_id in (").append(subordinateSql).append(") ");
                sqlMap.put("dataFiltering", sql.toString());
                TL.set(sqlMap);
                return true;
            }
        }
        return true;
    }

    @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 {
        TL.remove();
    }

    //提供静态方法获取线程域中的sqlMap
    public static HashMap<String, String> getSqlMap() {
        return TL.get();
    }


}

2.在对应模块config中进行配置 需要继承WebMvcConfigurerAdapter

package com.meishi.mall.config;

import com.github.wxiaoqi.security.auth.client.interceptor.ServiceAuthRestInterceptor;
import com.github.wxiaoqi.security.auth.client.interceptor.UserAuthRestInterceptor;
import com.github.wxiaoqi.security.common.handler.GlobalExceptionHandler;
import com.meishi.core.interceptor.SqlMapInterceptor;
import com.meishi.mall.Interceptor.OrderSqlMapInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * 拦截器和全局配置
 *
 * @author ace
 * @version 2017/9/8
 */
@Configuration("securityWebConfig")
@Primary
public class WebConfiguration extends WebMvcConfigurerAdapter {
    @Bean
    GlobalExceptionHandler getGlobalExceptionHandler() {
        return new GlobalExceptionHandler();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
            增加用户信息拦截器
         */
        registry.addInterceptor(getSqlMapInterceptor()).addPathPatterns("/**");
    }


    /**
     * 配置用户信息拦截
     * @return
     */
    @Bean
    SqlMapInterceptor getSqlMapInterceptor() {
        return new SqlMapInterceptor();
    }


3.使用该拦截器

  @ApiOperation("分页查询")
    @GetMapping(value = "/list")
    public ActionResult list(@RequestParam Map<String, Object> params) {
        HashMap<String, String> sqlMap = SqlMapInterceptor.getSqlMap();
        String dataFiltering = sqlMap.get("dataFiltering").substring(3);
        List<String> list = Arrays.asList(new String[]{"create_time"});
        return new ActionResult<>(StatusCode.SUCCESS, iUmsMemberService.selectPage(new Query<>(params),
                new EntityWrapper<UmsMember>().eq("deleted", 0).addFilter(dataFiltering).orderDesc(list)));
    }
原创文章 39 获赞 6 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42261668/article/details/100100939