935090232@qq.com
2021-10-24 5f7141c09fdcfd4ed7ec6db42069133ad978880e
新增本地缓存方法,逐步替换redis
3 files modified
136 ■■■■■ changed files
zq-erp/src/main/java/com/matrix/system/common/actions/DeveloperAction.java 8 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/init/InitWebContainer.java 46 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/interceptor/HostInterceptor.java 82 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/actions/DeveloperAction.java
@@ -3,6 +3,7 @@
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.core.web.BaseAction;
import com.matrix.system.common.init.InitWebContainer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -73,4 +74,11 @@
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, "debug模式开启");
    }
    @RequestMapping("/getLocalCache")
    public @ResponseBody AjaxResult getLocalCache(String key) {
        Object cache=InitWebContainer.getLocalCache(key);
        return AjaxResult.buildSuccessInstance(cache);
    }
}
zq-erp/src/main/java/com/matrix/system/common/init/InitWebContainer.java
@@ -4,16 +4,24 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.servlet.ServletContext;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.StringUtils;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.SysCompany;
import com.matrix.system.common.service.SysCompanyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.context.ServletContextAware;
@@ -25,12 +33,14 @@
 * @author:姜友瑶
 * @date 2016年10月18日
 */
@Controller
public class InitWebContainer   implements ServletContextAware{
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class InitWebContainer   implements ApplicationRunner {
    private static ConcurrentMap<String,Object> localCache=new ConcurrentHashMap(60);
    private static final String TRUE = "true";
    private ServletContext servletContext;
    static private final String LANGUAGE_ZH = "zh";
@@ -56,12 +66,10 @@
     * 
     *  容器启动后加载数据
     * @author:姜友瑶
     * @param sc
     * @date 2016年10月18日
     */
    @Override
    public void setServletContext(ServletContext sc) {
        this.servletContext = sc;
    public void run(ApplicationArguments args) {
        // 初始化调试模式
        initDebug();
@@ -70,7 +78,7 @@
        //初始化公司
        initParams();
        LogUtil.info("\r\n\r\n**********************************************\r\n"
                + "* =========== Matrix启动成功 ===========\r\n"
                + "* =========== 成功 ===========\r\n"
                + "* DEBUG模式:" + debug+"*\r\n"
                + "* 语言环境:" + Locale.getDefault().getLanguage()+"\r\n"
             
@@ -118,10 +126,30 @@
        for (SysCompany sysCompany : company) {
            companyMap.put(sysCompany.getComWebUrl(), sysCompany);
        }
        servletContext.setAttribute("companyMap", companyMap);
        saveLocalCache("companyMap", companyMap);
    }
    /**
     * 获取本地缓存
     * @param key
     * @param <T>
     * @return
     */
    public static <T> T getLocalCache(String key){
        return (T)localCache.get(key);
    }
    /**
     * 保存一个本地缓存
     * @param key
     * @param value
     */
    public static void saveLocalCache(String key,Object value){
          if(null!=localCache.put(key,value)){
              LogUtil.debug("覆盖原有缓存{}",key);
          }
    }
}
zq-erp/src/main/java/com/matrix/system/common/interceptor/HostInterceptor.java
@@ -1,8 +1,10 @@
package com.matrix.system.common.interceptor;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.StringUtils;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.SysCompany;
import com.matrix.system.common.init.InitWebContainer;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@@ -15,6 +17,7 @@
/**
 * 域名与公司对应绑定拦截
 *
 * @author JIANGYOUYAO
 * @email 935090232@qq.com
 * @date 2017年11月29日
@@ -23,55 +26,48 @@
public class HostInterceptor extends HandlerInterceptorAdapter {
    public static final String ATTR_COMPANY = "company";
    public static final String ATTR_COMPANY = "company";
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
    }
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
    }
    /**
     * 通用拦截器
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
        SysCompany company= WebUtil.getSessionAttribute(ATTR_COMPANY);
    /**
     * 通用拦截器
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
        if (company != null) {
            LogUtil.debug("匹配到公司{}", company.getComName());
            return true;
        } else {
        // 获得请求的域名--由小程序直接传过来companyCode参数对应公司的网址
        String host = request.getHeader("companyCode");
        LogUtil.debug("当前请求域名{}", host);
            @SuppressWarnings("unchecked")
            Map<String, SysCompany> companyMap = (Map<String, SysCompany>) WebUtil.getServletContext()
                    .getAttribute("companyMap");
            if(Objects.nonNull(companyMap)){
                Set<String> hostSet = companyMap.keySet();
                for (String key : hostSet) {
                    LogUtil.debug("-- 匹配公司key={},host={} 匹配结果={}", key , host, key.contains(host));
                    if (key.contains(host)) {
                        // 查到公司后存到sesssion中
                        WebUtil.setSessionAttribute(ATTR_COMPANY, companyMap.get(key));
                        return true;
                    }
                }
            }
        }
        LogUtil.debug("没有匹配到对应的公司");
        return false;
    }
        // 获得请求的域名--由小程序直接传过来companyCode参数对应公司的网址
        String host = request.getHeader("companyCode");
        LogUtil.debug("当前请求域名{}", host);
        if (StringUtils.isBlank(host)) {
            return false;
        }
        Map<String, SysCompany> companyMap = InitWebContainer.getLocalCache("companyMap");
        SysCompany company=companyMap.get(host);
        if(Objects.nonNull(company)){
            // 查到公司后存到sesssion中
            LogUtil.debug("匹配到公司{}", company.getComName());
            WebUtil.setSessionAttribute(ATTR_COMPANY, company);
            return true;
        }
        LogUtil.debug("没有匹配到对应的公司");
        return false;
    }
    /**
     * 获取当前域名对于的公司ID
     * @return
     */
    public static Long getCompanyId() {
        return ((SysCompany) WebUtil.getSessionAttribute(ATTR_COMPANY)).getComId();
    }
    /**
     * 获取当前域名对于的公司ID
     *
     * @return
     */
    public static Long getCompanyId() {
        return ((SysCompany) WebUtil.getSessionAttribute(ATTR_COMPANY)).getComId();
    }
}