|
@ -6,23 +6,32 @@ package com.yihu.wlyy.interceptors;
|
|
|
|
|
|
import com.yihu.wlyy.entity.gateway.GcHttpLog;
|
|
|
import com.yihu.wlyy.entity.gateway.GcToken;
|
|
|
import com.yihu.wlyy.entity.security.Token;
|
|
|
import com.yihu.wlyy.entity.url.CudUrl;
|
|
|
import com.yihu.wlyy.repository.gateway.GcHttpLogDao;
|
|
|
import com.yihu.wlyy.repository.gateway.GcTokenDao;
|
|
|
import com.yihu.wlyy.util.DateUtil;
|
|
|
import com.yihu.wlyy.util.NetworkUtil;
|
|
|
import com.yihu.wlyy.util.SystemConf;
|
|
|
import com.yihu.wlyy.util.SystemData;
|
|
|
import com.yihu.wlyy.web.gateway.vo.base.BaseResultModel;
|
|
|
import net.sf.json.JSONObject;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.method.HandlerMethod;
|
|
|
import org.springframework.web.servlet.ModelAndView;
|
|
|
import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.lang.reflect.Method;
|
|
|
import java.util.Date;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* 对外的请求拦截
|
|
@ -34,7 +43,7 @@ public class GateWayInterceptor extends BaseInterceptor {
|
|
|
@Autowired
|
|
|
private GcHttpLogDao httpLogDao;
|
|
|
@Autowired
|
|
|
private GcTokenDao tokenDao;
|
|
|
private GcTokenDao gcTokenDaoDao;
|
|
|
|
|
|
/**
|
|
|
* preHandle:预处理回调方法
|
|
@ -47,33 +56,158 @@ public class GateWayInterceptor extends BaseInterceptor {
|
|
|
*/
|
|
|
@Override
|
|
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
|
|
String token = request.getParameter("accesstoken");
|
|
|
|
|
|
boolean flag = true;
|
|
|
String accesstoken = request.getParameter("accesstoken");
|
|
|
String ip = NetworkUtil.getIpAddress(request);
|
|
|
//********************************判断accesstoken********************************
|
|
|
try {
|
|
|
GcToken gcToken = tokenDao.findByToken(token);
|
|
|
GcToken gcToken = gcTokenDaoDao.findByToken(accesstoken);
|
|
|
if (gcToken == null) {
|
|
|
saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), null, token, request.getRequestURI(), GcHttpLog.flagEm.error.getCode(), BaseResultModel.codeEm.token_no_power.getMessage());
|
|
|
saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), null, accesstoken, request.getRequestURI(), GcHttpLog.flagEm.error.getCode(), BaseResultModel.codeEm.token_no_power.getMessage());
|
|
|
//没权限
|
|
|
BaseResultModel baseResultModel = new BaseResultModel(BaseResultModel.codeEm.token_no_power.getCode(), BaseResultModel.codeEm.token_no_power.getMessage());
|
|
|
response.getOutputStream().write(JSONObject.fromObject(baseResultModel).toString().getBytes());
|
|
|
}
|
|
|
if (gcToken.getDel() == null || gcToken.getDel() == 0) {
|
|
|
saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), null, token, request.getRequestURI(), GcHttpLog.flagEm.error.getCode(), BaseResultModel.codeEm.token_out_effect.getMessage());
|
|
|
saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), null, accesstoken, request.getRequestURI(), GcHttpLog.flagEm.error.getCode(), BaseResultModel.codeEm.token_out_effect.getMessage());
|
|
|
//token无效
|
|
|
BaseResultModel baseResultModel = new BaseResultModel(BaseResultModel.codeEm.token_out_effect.getCode(), BaseResultModel.codeEm.token_out_effect.getMessage());
|
|
|
response.getOutputStream().write(JSONObject.fromObject(baseResultModel).toString().getBytes());
|
|
|
}
|
|
|
if (System.currentTimeMillis() > gcToken.getOutTime().getTime()) {
|
|
|
saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), null, token, request.getRequestURI(), GcHttpLog.flagEm.error.getCode(), BaseResultModel.codeEm.token_out_time.getMessage());
|
|
|
saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), null, accesstoken, request.getRequestURI(), GcHttpLog.flagEm.error.getCode(), BaseResultModel.codeEm.token_out_time.getMessage());
|
|
|
//token过期
|
|
|
BaseResultModel baseResultModel = new BaseResultModel(BaseResultModel.codeEm.token_out_time.getCode(), BaseResultModel.codeEm.token_out_time.getMessage());
|
|
|
response.getOutputStream().write(JSONObject.fromObject(baseResultModel).toString().getBytes());
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), null, token, request.getRequestURI(), GcHttpLog.flagEm.error.getCode(), e.getMessage());
|
|
|
saveHttpLog(ip, JSONObject.fromObject(request.getParameterMap()).toString(), null, accesstoken, request.getRequestURI(), GcHttpLog.flagEm.error.getCode(), e.getMessage());
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
//********************************判断accesstoken********************************
|
|
|
//********************************判断登陆的token**************************************
|
|
|
try {
|
|
|
request.setCharacterEncoding("UTF-8");
|
|
|
request.setAttribute("log-start", new Date().getTime());
|
|
|
response.setCharacterEncoding("UTF-8");
|
|
|
org.json.JSONObject json = getAgent(request);
|
|
|
|
|
|
if (json == null) {
|
|
|
// 未登录
|
|
|
response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (json.has("uid") && json.has("admin_token") && StringUtils.isNotEmpty(json.getString("admin_token"))) {
|
|
|
String adminToken = SystemConf.getInstance().getSystemProperties().getProperty("admin_token");
|
|
|
String adminUid = SystemConf.getInstance().getSystemProperties().getProperty("admin_uid");
|
|
|
if (json.getString("uid").equals(adminUid) && json.getString("admin_token").equals(adminToken)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
String tokenStr = json.has("token") ? json.getString("token") : "";
|
|
|
String uid = json.has("uid") ? json.getString("uid") : "";
|
|
|
String imei = json.has("imei") ? json.getString("imei") : "";
|
|
|
String observer = json.has("observer") ? json.getString("observer") : "";
|
|
|
Integer platform = json.has("platform") ? json.getInt("platform") : 4;
|
|
|
logger.debug("tokenStr:" + tokenStr);
|
|
|
logger.debug("uid:" + uid);
|
|
|
logger.debug("imei:" + imei);
|
|
|
logger.debug("observer:" + observer);
|
|
|
logger.debug("platform:" + platform);
|
|
|
|
|
|
//如果是观察者直接返回true
|
|
|
if (!org.springframework.util.StringUtils.isEmpty(observer) && observer.equals("1")) {
|
|
|
Class cls = ((HandlerMethod) handler).getBeanType();
|
|
|
RequestMapping clsRm = (RequestMapping) cls.getAnnotation(RequestMapping.class);
|
|
|
Method method = ((HandlerMethod) handler).getMethod();
|
|
|
RequestMapping mthRm = method.getAnnotation(RequestMapping.class);
|
|
|
String url = "";
|
|
|
String urlCls = "";
|
|
|
String urlMth = "";
|
|
|
if (clsRm.value() != null && clsRm.value().length > 0) {
|
|
|
urlCls = clsRm.value()[0];
|
|
|
}
|
|
|
if (mthRm.value() != null && mthRm.value().length > 0) {
|
|
|
urlMth = mthRm.value()[0];
|
|
|
}
|
|
|
if (StringUtils.isNotEmpty(urlCls)) {
|
|
|
url += urlCls.startsWith("/") ? urlCls : ("/" + urlCls);
|
|
|
}
|
|
|
if (StringUtils.isNotEmpty(urlMth)) {
|
|
|
url += urlMth.startsWith("/") ? urlMth : ("/" + urlMth);
|
|
|
}
|
|
|
url = url.replace("\\", "/").replace("//", "/");
|
|
|
CudUrl cudUrl = cudUrlDao.findByUrl(url);
|
|
|
|
|
|
if (url.equals("/doctor/consult/readed")) {
|
|
|
response.getOutputStream().write(write(200, "操作成功").getBytes());
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (cudUrl != null) {
|
|
|
if (StringUtils.isNotEmpty(cudUrl.getMethod()) &&
|
|
|
request.getMethod().toUpperCase().compareTo(cudUrl.getMethod()) != 0) {
|
|
|
return true;
|
|
|
} else {
|
|
|
response.getOutputStream().write(error(403, "该操作没有权限").getBytes());
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
if (StringUtils.isEmpty(tokenStr) || StringUtils.isEmpty(imei) || StringUtils.isEmpty(uid)) {
|
|
|
response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
Token token = null;
|
|
|
Map<String, Token> tempMap = null;
|
|
|
if (platform == 4) {
|
|
|
tempMap = SystemData.doctorPCTokens;
|
|
|
}
|
|
|
token = tempMap.get(uid);
|
|
|
if (token == null) {
|
|
|
token = tokenDao.findByPatient(uid, platform);
|
|
|
if (token != null) {
|
|
|
// 加入缓存
|
|
|
tempMap.put(uid, token);
|
|
|
}
|
|
|
}
|
|
|
// 2、医生端app,3、微信公众号wechat,4、医生端pc,或者 PC端取药系统 或者对外系统
|
|
|
if (token == null || (token.getPlatform() != 4)) {
|
|
|
// 未登录
|
|
|
response.getOutputStream().write(error(SystemConf.NOT_LOGIN, "请登录后再操作!").getBytes());
|
|
|
flag = false;
|
|
|
} else {
|
|
|
if (token.getTimeout().getTime() < new Date().getTime()) {
|
|
|
// 登录超时
|
|
|
response.getOutputStream().write(error(SystemConf.LOGIN_TIMEOUT, "登录超时,请重新登录").getBytes());
|
|
|
flag = false;
|
|
|
} else if (!StringUtils.equals(tokenStr, token.getToken()) || !StringUtils.equals(uid, token.getUser()) || !StringUtils.equals(imei, token.getImei())) {
|
|
|
// 别处登录
|
|
|
response.getOutputStream().write(error(SystemConf.LOGIN_OTHER, "帐号在别处登录,请重新登录").getBytes());
|
|
|
flag = false;
|
|
|
} else {
|
|
|
// 一天只更新一次
|
|
|
if (DateUtil.getDays(token.getCzrq(), DateUtil.getNowDateShort()) != 0) {
|
|
|
// 今天未更新,则更新缓存
|
|
|
token.setCzrq(new Date());
|
|
|
// 更新内存
|
|
|
tempMap.put(uid, token);
|
|
|
// 更新数据库
|
|
|
tokenDao.save(token);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
//********************************判断登陆的token**************************************
|
|
|
return flag;
|
|
|
}
|
|
|
|
|
|
/**
|