Commit b1141af2 authored by chuwanshun's avatar chuwanshun

Merge branch 'dev' of http://180.168.156.211:2903/wanjianbin/kyb-search into dev

# Conflicts: # src/main/java/com/cesgroup/kingkong/service/impl/QueryService.java
parents 2f94b337 3f2531ab
package com.cesgroup.common.utils;
/**
* web层统一返回类型
* @author qiaokun
* @date 2018/07/18
*/
public class ApiResponse {
private int errCode = 0;
private String errMsg;
private Object data;
public ApiResponse(){
}
public ApiResponse(Object data) {
this.data = data;
}
public ApiResponse(ApiResponseEnum apiResponseEnum){
this.errCode = apiResponseEnum.getErrCode();
this.errMsg = apiResponseEnum.getErrMsg();
}
public int getErrCode() {
return errCode;
}
public void setErrCode(int errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return "ApiResponse{" +
"errCode=" + errCode +
", errMsg='" + errMsg + '\'' +
", data=" + data +
'}';
}
}
package com.cesgroup.common.utils;
/**
* web 层返回信息枚举
* @author qiaokun
* @2018/08/13
*/
public enum ApiResponseEnum {
/**
* API调用成功返回
*/
SUCCESS(10000,"请求成功"),
/**
* 系统错误
*/
SYS_ERROR(10103, "系统错误"),
IP_ERROR(10104, "ip地址格式错误"),
/**
* 参数错误
*/
AUTH_SIGN_ERROR(10201,"签名验证失败"),
AUTH_IP_ERROR(10202,"IP白名单验证失败"),
AUTH_TOKEN_ERROR(10203, "token验证失败"),
TOKEN_OVERTIME_ERROR(10204, "token已过期"),
APPLY_TOKEN_ERROR(10205, "秘钥校对失败"),
;
public static String AUTH_CENTER_SERVICE = "kyb-search";
private int errCode = 0;
private String errMsg;
private ApiResponseEnum(int errCode, String errMsg) {
this.errCode = errCode;
this.errMsg = errMsg;
}
public int getErrCode() {
return errCode;
}
public void setErrCode(int errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
}
package com.cesgroup.common.utils;
import com.github.pagehelper.Page;
import javax.servlet.http.HttpServletRequest;
/**
* web层统一返回工具类
*/
public class ApiResultUtil {
private ApiResultUtil(){}
/**
* 获取请求成功响应的ApiResponse
* @param data
* @return
*/
public static ApiResponse getApiResponse(Object data) {
return getApiResponse(data, ApiResponseEnum.SUCCESS );
}
public static ApiResponse getApiResponse(Object data,int code,String msg) {
ApiResponse dataApiResult = new ApiResponse();
dataApiResult.setData(data);
dataApiResult.setErrCode(code);
dataApiResult.setErrMsg(msg);
return dataApiResult;
}
public static ApiResponse getApiResponse(Object data, ApiResponseEnum apiResponseEnum) {
ApiResponse dataApiResult = new ApiResponse();
dataApiResult.setData(data);
dataApiResult.setErrCode(apiResponseEnum.getErrCode());
dataApiResult.setErrMsg(apiResponseEnum.getErrMsg());
return dataApiResult;
}
public static JsonDataGrid getApiResponse(Page page,String msg){
JsonDataGrid j=new JsonDataGrid();
j.setMsg(msg);
j.setRows(page.getResult());
j.setTotal(page.getTotal());
j.setPageCount(page.getPages());
j.setPageIndex(page.getPageNum());
return j;
}
public static JsonDataGrid getApiResponse(String state,String msg){
JsonDataGrid j=new JsonDataGrid();
j.setMsg(msg);
j.setState(state);
return j;
}
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getUserIP
* <ul>
* @description 获取用户真实的IP地址
* </ul>
* @createdTime 2017年12月30日 下午6:42:17
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getUserIP(HttpServletRequest request){
String ERROR_IP = "127.0.0.1";
// 优先取 X-Real-IP
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("x-forwarded-for");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
if ("0:0:0:0:0:0:0:1".equals(ip))
{
ip = ERROR_IP;
}
}
if ("unknown".equalsIgnoreCase(ip))
{
ip = ERROR_IP;
return ip;
}
int index = ip.indexOf(',');
if (index >= 0)
{
ip = ip.substring(0, index);
}
return ip;
}
}
/**
* eip
* cn.sh.ideal.core.util.JSONOperateResult.java
*/
package com.cesgroup.common.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* 提供给DataGrid控件的JSON对象
*
*/
public class JsonDataGrid<T> {
/** 记录集合* */
private List<T> rows = new ArrayList<>();
/** 总记录* */
private long total = 0;
// 总页数
private long pageCount = 0;
// 当前页
private int pageIndex = 0;
private String state;
private String msg;
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public long getPageCount() {
return pageCount;
}
public void setPageCount(long pageCount) {
this.pageCount = pageCount;
}
public int getPageIndex() {
return pageIndex;
}
public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}
/**
* 添加数据集合
*
* @param items
*/
public void addAll(Collection<T> items) {
this.rows.addAll(items);
}
/**
* 添加数据
*
* @param obj
*/
public void addItem(T obj) {
this.rows.add(obj);
}
/**
* 移除数据
*
* @param obj
*/
public void removeItem(T obj) {
this.rows.remove(obj);
}
public List<T> getRows() {
return rows;
}
public void setRows(List<T> rows) {
this.rows = rows;
}
public long getTotal() {
return total;
}
/** 总记录* */
public void setTotal(long total) {
this.total = total;
}
}
package com.cesgroup.kingkong.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @program: kyb-search
* @description: ip白名单实体类
* @author: Wanjianbin
* @create: 2019-08-27 14:32
**/
@Data
@TableName("ip_check")
public class IPCheckEntity {
@TableId
private Integer id;
private String ipAddress;
private Long lastCheckTime;
private String token;
private Long lastTokenTime;
}
package com.cesgroup.kingkong.interceptor;
import java.lang.annotation.*;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface RequiredPermission {
}
package com.cesgroup.kingkong.interceptor;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.internal.util.AlipaySignature;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.cesgroup.common.utils.ApiResponse;
import com.cesgroup.common.utils.ApiResponseEnum;
import com.cesgroup.common.utils.ApiResultUtil;
import com.cesgroup.kingkong.entity.IPCheckEntity;
import com.cesgroup.kingkong.entity.SecretKeyEntity;
import com.cesgroup.kingkong.service.IPCheckService;
import com.cesgroup.kingkong.service.SecretKeyService;
import com.github.pagehelper.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @program: kyb-search
* @description: 拦截器
* @author: Wanjianbin
* @create: 2019-08-27 09:48
**/
@Slf4j
//@Component
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
private IPCheckService ipCheckService;
@Autowired
private SecretKeyService secretKeyService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("--------------------HTTP BEGIN, PREHANDLE BEGIN--------------------");
log.info("--------------------REQUEST FROM: {}", ApiResultUtil.getUserIP(request));
log.info("--------------------REQUEST URI IS: {}", request.getRequestURI());
log.info("--------------------PARAMS BEGIN--------------------");
Map<String, String[]> paramsMap = request.getParameterMap();
Map<String, String> params = new HashMap<>();
for (Map.Entry<String, String[]> entry : paramsMap.entrySet()){
String[] values = entry.getValue();
StringBuilder sb = new StringBuilder();
for (String value : values) {
sb.append(value);
}
log.info(entry.getKey() + " : " + sb.toString());
params.put(entry.getKey(), sb.toString());
}
log.info("--------------------PARAMS END----------------------");
// 免校验接口
if (hasPermission(handler)){
log.info("NO TOKENINTERCEPTOR, GOING TO CONTROLLER");
return true;
}
ApiResponse apiResponse =null;
String token = request.getHeader("token");
// String remoteAddr = ApiResultUtil.getUserIP(request);
if(StringUtil.isEmpty(token)){
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_TOKEN_ERROR);
}else {
IPCheckEntity ipCheckEntity = ipCheckService.getOne(new QueryWrapper<IPCheckEntity>().eq("token", token));
if(ipCheckEntity != null){
// if (token.equals(ipCheckEntity.getToken())){
// 校验token是否过期
if(checkToken(ipCheckEntity)){
/* if (checkSign(params)){
IPCheckEntity entity = new IPCheckEntity();
entity.setLastCheckTime(new Date().getTime());
this.ipCheckService.update(entity, new UpdateWrapper<IPCheckEntity>().eq("token", token));
return true;
}else {
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_SIGN_ERROR);
}*/
return true;
}else {
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.TOKEN_OVERTIME_ERROR);
}
}else {
apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_TOKEN_ERROR);
}
// }else {
// apiResponse = ApiResultUtil.getApiResponse(null, ApiResponseEnum.AUTH_IP_ERROR);
// }
}
response.setCharacterEncoding("utf-8");
responseMessage(response,response.getWriter(),apiResponse);
return false;
}
private boolean checkToken(IPCheckEntity ipCheckEntity){
Long lastTokenTime = ipCheckEntity.getLastTokenTime();
Date now = new Date();
long diff = now.getTime() - lastTokenTime;
if(diff < 1000*60*60*24){
return true;
}
return false;
}
/**
* @Description: 校验签名
* @Param:
* @return:
* @Author: Wanjianbin
* @Date: 2019/8/27
*/
private boolean checkSign(Map params) throws Exception{
String sign = MapUtils.getString(params, "sign");
if (StringUtils.isEmpty(sign)){
return false;
}
SecretKeyEntity secretKeyEntity = secretKeyService.getById(1);
if(secretKeyEntity == null){
log.info("-------------------- secretKey SELECT ERROR --------------------");
return false;
}
String publicKey = secretKeyEntity.getPublicKey();
// params.remove("sign");
// String paramsString = JSON.toJSONString(params);
if(!AlipaySignature.rsaCheckV2(params, publicKey, "UTF-8")){
log.info("-------------------- HTTP END, TOKEN ERROR : {}--------------------", sign);
return false;
}
return true;
}
/**
* 是否有权限
*
* @param handler
* @return
*/
private boolean hasPermission(Object handler) {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 获取方法上的注解
RequiredPermission requiredPermission = handlerMethod.getMethod().getAnnotation(RequiredPermission.class);
// 如果方法上的注解为空 进行拦截
if (requiredPermission == null) {
return false;
}
}
return true;
}
/**
* 返回信息给客户端
*
* @param response
* @param out
* @param apiResponse
*/
private void responseMessage(HttpServletResponse response, PrintWriter out, ApiResponse apiResponse) {
response.setContentType("application/json; charset=utf-8");
out.print(JSONObject.toJSONString(apiResponse));
out.flush();
out.close();
}
}
package com.cesgroup.kingkong.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//@Configuration
public class TokenWebMvcConfigurerAdapter implements WebMvcConfigurer {
@Autowired
private TokenInterceptor tokenInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(tokenInterceptor).addPathPatterns("/**");
}
}
......@@ -29,17 +29,7 @@ public class EsMapper {
String result = httpClientHelper.postJSON(uriString, query, header);
return result;
}
public String getArticleInfo() {
//String uriString =esHostAddress+"/"+"testhbase*/"+"_search/";
HashMap<String, Object> header = new HashMap<String, Object>();
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("start", 0);
paramMap.put("count", 25);
paramMap.put("query", "AFFILCITY(beijing)");
header.put("X-ELS-APIKey", "d7513bc36ec90aa7662c0cfb28b3dd3b");
String result = httpClientHelper.get(arHostAddress, paramMap, header);
return result;
}
public String getArticleInfo(HashMap<String, Object> paramMap){
HashMap<String, Object> header = new HashMap<String, Object>();
header.put("X-ELS-APIKey", "d7513bc36ec90aa7662c0cfb28b3dd3b");
......
package com.cesgroup.kingkong.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cesgroup.kingkong.entity.IPCheckEntity;
/**
* @program: kyb-search
* @description: IP白名单
* @author: Wanjianbin
* @create: 2019-08-27 14:55
**/
public interface IPCheckMapper extends BaseMapper<IPCheckEntity> {
}
package com.cesgroup.kingkong.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cesgroup.kingkong.entity.IPCheckEntity;
/**
* @program: kyb-search
* @description: ip白名单
* @author: Wanjianbin
* @create: 2019-08-27 14:59
**/
public interface IPCheckService extends IService<IPCheckEntity> {
}
package com.cesgroup.kingkong.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cesgroup.kingkong.entity.IPCheckEntity;
import com.cesgroup.kingkong.mapper.IPCheckMapper;
import com.cesgroup.kingkong.service.IPCheckService;
import org.springframework.stereotype.Service;
/**
* @program: kyb-search
* @description: ip白名单
* @author: Wanjianbin
* @create: 2019-08-27 15:01
**/
@Service
public class IPCheckServiceImpl extends ServiceImpl<IPCheckMapper, IPCheckEntity> implements IPCheckService {
}
......@@ -38,7 +38,9 @@ public class QueryService {
public Map<String, Object> getById(String id) {
Map<String, Object> result = new HashMap<String, Object>();
// 首先id满足条件,通过Id去查
// 匹配标准ID
String VALID_NAME = "^[A-Za-z][A-Za-z].*[.][0-9]$";
// 前缀正则:匹配前两位为英文字符
String PRE_VALID_NAME = "^[A-Za-z][A-Za-z].*$";
long ti = System.currentTimeMillis();
System.out.println("开始查询:" + ti);
......@@ -74,19 +76,6 @@ public class QueryService {
}
/**
* 查询论文信息
*
* @return Map<String,Object>
*/
public Map<String, Object> queryArticleInfo() {
Map<String, Object> result = new HashMap<String, Object>();
String resultJsonString = esMapper.getArticleInfo();
System.out.println("查询出的字符串" + resultJsonString);
result = parseArticleInfo(resultJsonString);
return result;
}
/**
* @Description: 查询论文信息
* @Param: [params]
* @return: java.util.Map<java.lang.String,java.lang.Object>
......@@ -128,7 +117,6 @@ public class QueryService {
paramMap.put("query", queryStr.toString());
String resultJsonString = esMapper.getArticleInfo(paramMap);
System.out.println("查询出的字符串: " + resultJsonString);
Map<String, Object> result = parseArticleInfo(resultJsonString);
if (result != null) {
List<Map> list = (List<Map>) result.get("entry");
......@@ -148,8 +136,10 @@ public class QueryService {
*/
private Map<String, Object> parseArticleInfo(String articleInfo) {
if (StringUtils.isNotEmpty(articleInfo)) {
// JSON解析配置
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
Map<String, Object> result = (Map<String, Object>) JSONObject.parse(articleInfo);
// 抽出search-results信息
return (Map<String, Object>) result.get("search-results");
}
return null;
......
package com.cesgroup.kingkong.web;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cesgroup.common.utils.*;
import com.cesgroup.kingkong.commons.utils.JwtUtils;
import com.cesgroup.kingkong.core.security.model.JwtUser;
import com.cesgroup.kingkong.entity.IPCheckEntity;
import com.cesgroup.kingkong.interceptor.RequiredPermission;
import com.cesgroup.kingkong.service.IPCheckService;
import com.cesgroup.kingkong.service.SecretKeyService;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @program: kyb-search
* @description: token
* @author: Wanjianbin
* @create: 2019-08-27 15:32
**/
@RestController
@RequestMapping("/token")
public class TokenController extends BaseServiceController<IPCheckEntity, IPCheckService> {
@Autowired
SecretKeyService secretKeyService;
@PostMapping("/getToken")
@RequiredPermission
public RestAPIResult<Object> getToken(String sign) throws Exception {
// String ip = ApiResultUtil.getUserIP(request);
Map<String, Object> params = RSAEncryptUtil.resolveParamsForSign(sign, secretKeyService.getById(2));
String ip = MapUtils.getString(params, "randomStr");
IPCheckEntity ipCheckEntity = this.service.getOne(new QueryWrapper<IPCheckEntity>().eq("ip_address", ip));
RestAPIResult<Object> panResult = new RestAPIResult<Object>(secretKeyService);
if(ipCheckEntity == null){
panResult.error(ApiResponseEnum.AUTH_IP_ERROR.getErrMsg());
}else {
JwtUser user = new JwtUser();
user.setId(ipCheckEntity.getId().toString());
user.setUserName(ip);
user.setLoginName(ip);
String token = JwtUtils.createJwtBySimpleUser(user, 1000 * 60 * 60 * 24, ApiResponseEnum.AUTH_CENTER_SERVICE);
ipCheckEntity.setToken(token);
ipCheckEntity.setLastTokenTime(new Date().getTime());
this.service.updateById(ipCheckEntity);
panResult.setRespData(token);
}
return panResult;
}
@GetMapping("/applyToken")
@RequiredPermission
public RestAPIResult<Object> applyToken(String sign) throws Exception {
Map<String, Object> params = RSAEncryptUtil.resolveParamsForSign(sign, secretKeyService.getById(2));
String applyDate = MapUtils.getString(params, "applyDate");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String today = sdf.format(new Date());
RestAPIResult<Object> panResult = new RestAPIResult<Object>(secretKeyService);
if(today.equals(applyDate)){
Map<String, Object> result = new HashMap<>();
result.put("today", today);
String randomStr = RandomUtil.getStringRandom(12, null);
result.put("randomStr", randomStr);
IPCheckEntity ipCheckEntity = new IPCheckEntity();
ipCheckEntity.setId(1);
ipCheckEntity.setIpAddress(randomStr);
this.service.updateById(ipCheckEntity);
panResult.setRespData(result);
}else {
panResult.error(ApiResponseEnum.APPLY_TOKEN_ERROR.getErrMsg());
}
return panResult;
}
@RequestMapping("/test")
public ApiResponse test(){
return ApiResultUtil.getApiResponse(null, ApiResponseEnum.SUCCESS);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment