收集大神讲解一资料:https://www.cnblogs.com/yjd_hycf_space/p/7526608.html
大神讲解二:https://www.cnblogs.com/lwbqqyumidi/p/3804883.html
大神讲解三:https://blog.csdn.net/jingzhi1230/article/details/80432008
大神四:https://blog.csdn.net/fang323619/article/details/73904351
https://www.cnblogs.com/snow-flower/p/6114765.html
验证码:https://www.cnblogs.com/AdamFamily/p/6379676.html
验证码:https://blog.csdn.net/pengmm1990/article/details/70158437
https://blog.csdn.net/ysk_xh_521/article/details/77530292
https://blog.csdn.net/qq_35572020/article/details/53033203
利用ThreadLocal保存登录Session信息
https://blog.csdn.net/Tongdao/article/details/81145400
https://blog.csdn.net/m0_37034294/article/details/80819150
c# 在C#中主线程和子线程如何实现互相传递数据https://blog.csdn.net/linshichen/article/details/52188613
每条线程都有属于自己的一个session实例https://blog.csdn.net/weixin_42158320/article/details/80520517
spring新线程中注入为空指针的问题https://blog.csdn.net/u010127245/article/details/51150812
https://blog.csdn.net/qq_38632641/article/details/82910775
https://blog.csdn.net/u010107350/article/details/50347925
http://blog.sina.com.cn/s/blog_5a15b7d10102v6ki.html
线程空指针工具类:https://blog.csdn.net/henry_chatter/article/details/77499055
https://blog.csdn.net/matthewwu/article/details/80922434
https://blog.csdn.net/u010107350/article/details/50347925
最终解决在线程类注入空指针中:定义JavaBean 为static 利用set @Resource属性初始化:
package com.business;
import java.security.Key;
import java.util.Map;
import java.util.concurrent.Callable;
import javax.annotation.Resource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;
import com.common.EncodeUtilHelp;
import com.common.Md5UtilHelp;
import com.cxytiandi.encrypt.util.AesEncryptUtils;
import com.cxytiandi.encrypt.util.RsaEncryptUtils;
import com.entity.LoginInfo;
import com.entity.ManagerInfo;
import com.entity.ManagerSettingInfo;
import com.service.LoginService;
@Service
public class KeepLoginInfo implements Callable<LoginInfo> {
private static final Logger logger=LogManager.getLogger(KeepLoginInfo.class);
private static LoginService loginService;
private ManagerInfo managerInfo;
private ManagerSettingInfo settingInfo;
public KeepLoginInfo(ManagerInfo managerInfo,ManagerSettingInfo settingInfo) {
this.managerInfo=managerInfo;
this.settingInfo=settingInfo;
}
public KeepLoginInfo() {
// TODO Auto-generated constructor stub
}
@Override
public LoginInfo call()throws Exception{
var loginInfo=keepInfo();
return loginInfo;
}
/**
* 存储登录信息
* @return
*/
public LoginInfo keepInfo() {
logger.info("子线程启动:准备处理登录信息");
LoginInfo loginInfo=new LoginInfo();
try {
var roleInfo = loginService.getRoles(settingInfo.getFSetingInfo().getRoId());
System.out.print("\r\n子线程中的查询:" + roleInfo.getName());
// 签名生成 用户ID+x+用户名进行MD5加密
String waitEncryptToken = settingInfo.getFSetingInfo().getAdId() + "x"
+ EncodeUtilHelp.encryptTool(managerInfo.getNickName());
Map<String, Key> kMap = RsaEncryptUtils.initKey();
String privateKey = RsaEncryptUtils.getPrivateKey(kMap);
//String publicKey = RsaEncryptUtils.getPublicKey(kMap);
String signs = RsaEncryptUtils.sign(waitEncryptToken.getBytes(),privateKey);
String token=Md5UtilHelp.getMD5String(signs);
loginInfo.setAdminNum(AesEncryptUtils
.EncryptAll(EncodeUtilHelp.decryptTool(settingInfo.getFSetingInfo().getAdId())));
loginInfo.setToken(AesEncryptUtils.EncryptAll(token));
loginInfo.setUserName(AesEncryptUtils.EncryptAll(managerInfo.getNickName()));
loginInfo.setRoleName(AesEncryptUtils.EncryptAll(roleInfo.getName()));
loginInfo.setuserRole(AesEncryptUtils.EncryptAll(roleInfo.getSweights()));
// System.out.print("等待签名字符串+waitEncryptToken:"+waitEncryptToken);
// System.out.print("\r\nmd5加密字符Token:"+token);
// System.out.print("\r\n是不是Md5:"+Md5UtilHelp.isEqualsToMd5(signs,token));
//System.out.print("\r\n签名:" + signs);
// System.out.print("\r\n是否是合格的签名:" + RsaEncryptUtils.verify(waitEncryptToken.getBytes(), publicKey, signs));
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
// prompt.setCode(7);
// prompt.setMessage("签名生成失败!");
// prompt.setDatas(null);
System.out.print("\r\n子线程出错");
}
logger.info("子线程处理完毕,准备交给主线程结果!");
return loginInfo;
}
@Resource
public void setServiceBean(LoginService loginService) {
KeepLoginInfo.loginService = loginService;
}
}
https://www.bbsmax.com/A/ke5j6Xkj5r/
参才大神:https://blog.csdn.net/matthewwu/article/details/80922434
java用多线程批次查询大量数据(Callable返回数据)方式
https://blog.csdn.net/dfBeautifulLive/article/details/82788830