SpringBoot+restFul+filter+threadLocal实现多租户的项目

本片博客参考了

https://blog.csdn.net/gebitan505/article/details/51614805

threadLocal的目的是:

 实现变量的全局话,在当前的项目当中是实现了用户名的多租户状态下的全局话

fiter:进行token的拦截,

ThreadLocal的代码

package com.zwl.util;

import java.util.HashMap;
import java.util.Map;

public class ThreadVariable {


    public static final String USER_ID = "userId";
    private static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();


    /**
     * 获得线程中保存的属性.
     *
     * @param attribute 属性名称
     * @return 属性值
     */
    public static Object get(String attribute) {
        Map map = (Map) threadLocal.get();
        if (map == null) {
            return null;
        }
        return map.get(attribute);
    }


    /**
     * report
     * 获得线程中保存的登录用户信息.
     */
    public static String getUserID() {
        Map map = (Map) threadLocal.get();
        if (map == null) {
            return null;
        }
        Object obj = map.get(USER_ID);

        if (obj != null) {
            return (String) obj;
        }
        return null;
    }


    public static void setUserID(String userID) {
        Map map = (Map) threadLocal.get();

        if (map == null) {
            map = new HashMap();
            threadLocal.set(map);
        }
        map.put(USER_ID, userID);
    }

    /**
     * 清除线程中保存的数据
     */
    public static void clearThreadVariable() {
        threadLocal.remove();
    }
}

filter中的代码:

package com.zwl.filter;

import com.alibaba.fastjson.JSON;
import com.zwl.model.baseresult.Result;
import com.zwl.model.baseresult.ResultCodeEnum;
import com.zwl.model.po.TokenModel;
import com.zwl.serviceimpl.RedisTokenManagerImpl;
import com.zwl.util.ThreadVariable;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author wb-zjp283121
 * @Title: TokenFilter
 * @ProjectName parent
 * @Description: token过滤器
 * @date 2018/7/615:26
 */
@Order(1)
// 重点
@WebFilter(filterName = "tokenFilter", urlPatterns = "/wx/*")
@Slf4j
public class TokenFilter implements Filter {

    @Autowired
    private RedisTokenManagerImpl manager;

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest h_request = (HttpServletRequest) request;

        String token = request.getParameter("token");
        String requestURL = h_request.getRequestURL().toString();
        log.info("<<token>>请求url:" + requestURL + "  token:" + token);
        ThreadVariable.clearThreadVariable();

        // 注册、登录、注册短信、首页、回调 不需要token
        if (requestURL.contains("/pay_notify.do") || requestURL.contains("/information/getInformationList") || requestURL.contains("/wx/gift/getGiftQrCode")) {
            chain.doFilter(request, response);
            return;
        }
        if (requestURL.contains("/information/getInformationInfo")) {
            chain.doFilter(request, response);
            return;
        }
        if (requestURL.contains("/user/authorization")) {
            chain.doFilter(request, response);
            return;
        }
        if (requestURL.contains("/task/task")) {
            chain.doFilter(request, response);
            return;
        }
        if (requestURL.contains("/qr/getQRCode") || requestURL.contains("/qr/getH5QrCode")) {
            chain.doFilter(request, response);
            return;
        }
        if (requestURL.contains(" /wx/gzh/sendFormId") || requestURL.contains(" /wx/gzh/getFormId")) {
            chain.doFilter(request, response);
            return;
        }

        //测试图片上传
        if (requestURL.contains("/wx/file/upload")) {
            chain.doFilter(request, response);
            return;
        }
        //H5支付
        if (requestURL.contains("/wx/product/H5Buy") || requestURL.contains("/wx/pay/auth/pay.do")) {
            chain.doFilter(request, response);
            return;
        }
        // 获取微信js api 权限  跟 h5登录权限
        if (requestURL.contains("/wx/gzh/getGzhJsApiToken") || requestURL.contains("/wx/user/h5WeChatLogin")) {
            chain.doFilter(request, response);
            return;
        }
        //发送验证码

        if (requestURL.contains("/wx/user/sendMsgCode") || requestURL.contains("/wx/user/checkCode")) {
            chain.doFilter(request, response);
            return;
        }
        //获取视频列表
        if (requestURL.contains("/wx/video/getVideoList")) {
            chain.doFilter(request, response);
            return;
        }
        //根据id获取视频
        if (requestURL.contains("/wx/video/getVideoInfoById")) {
            chain.doFilter(request, response);
            return;
        }
        //获取banner列表
        if (requestURL.contains("/wx/banner/getBannerList")) {
            chain.doFilter(request, response);
            return;
        }
        //获取图标列表
        if (requestURL.contains("/wx/icon/getIconList")) {
            chain.doFilter(request, response);
            return;
        }
        //套课程
        if (requestURL.contains("/classset/getPageAllClass") || requestURL.contains("/classset/setpAddBrowseCount") ||
                requestURL.contains("/classset/getById")) {
            chain.doFilter(request, response);
            return;
        }
        //节课程
        if (requestURL.contains("/classinfo/getPageByClassSetId") || requestURL.contains("/classinfo/getById")
                || requestURL.contains("/classinfo/setpAddBrowseCount")) {
            chain.doFilter(request, response);
            return;
        }
        //分享绑定上下级关系
        if (requestURL.contains("/user/shareRelation")) {
            chain.doFilter(request, response);
            return;
        }
        //获取商品列表 ||根据id获取商品详情
        if (requestURL.contains("/product/getProductList") || requestURL.contains("/product/getProductById")) {
            chain.doFilter(request, response);
            return;
        }
        //微信页面轮播图
        if (requestURL.contains("/wx/banner/selectBanner")) {
            chain.doFilter(request, response);
            return;
        }
        //线下活动签到
        if (requestURL.contains("/wx/offlineActivity/signIn") || requestURL.contains("/wx/salon/signIn")) {
            chain.doFilter(request, response);
            return;
        }
        //线下、沙龙主题详情购买
        if (requestURL.contains("/wx/offlineActivity/getOfflineActivityThemeList") || requestURL.contains("/wx/salon/getSalonThemeList")) {
            chain.doFilter(request, response);
            return;
        }
        //线下、沙龙主题详情购买
        if (requestURL.contains("/wx/offlineActivity/getOfflineActivityThemeDetailByThemeId")) {
            chain.doFilter(request, response);
            return;
        }
        //操作员登陆
        if (requestURL.contains("/wx/offlineActivity/offlineLogin") || requestURL.contains("/wx/salon/offlineLogin")) {
            chain.doFilter(request, response);
            return;
        }
        //线下、沙龙主题详情介绍页
        if (requestURL.contains("/wx/offlineActivity/getActivityCodeDetail") || requestURL.contains("/wx/salon/getSalonThemeDetailByThemeId")) {
            chain.doFilter(request, response);
            return;
        }
        //获取书籍list
        if (requestURL.contains("/wx/gift/getGiftList")||requestURL.contains("/wx/gift/getGiftDetailById")) {
            chain.doFilter(request, response);
            return;
        }
        //是否可分享
        if (requestURL.contains("/wx/user/isShare")) {
            chain.doFilter(request, response);
            return;
        }
        // 验证token
        // 这里token如果接收有空格的地方,,那就是+号没有处理好。。可以考虑变成%2B
        if (StringUtils.isBlank(token)) {
            Result result = new Result();
            result.setCode("900");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().println(JSON.toJSONString(result));
            return;
        }
        token = token.replaceAll(" ", "+");
        TokenModel model = manager.getToken(token);
        if (manager.checkToken(model)) {
            // 如果token验证成功,将token对应的用户id存在request中,便于之后注入
            // request.setAttribute(Constants.CURRENT_USER_ID, model.getName());
            // app请求就一次,所有session没有用处 除非pc
            // session.setAttribute(Constants.CURRENT_USER_ID,
            // model.getuserId());
            chain.doFilter(request, response);
        } else {
            // 如果验证token失败
            Result result = new Result();
            result.setCode("900");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().println(JSON.toJSONString(result));
            return;
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

猜你喜欢

转载自blog.csdn.net/wb_zjp283121/article/details/85156132