9e03fa8b7b8f56a9c912593425dc7ee5f285ce15.svn-base 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package com.chinacreator.videoalliance.query.action;
  2. import java.io.PrintWriter;
  3. import java.util.Date;
  4. import java.util.List;
  5. import java.util.regex.Pattern;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import com.chinacreator.common.pipe.DataOutPipe;
  12. import com.chinacreator.common.util.MD5;
  13. import com.chinacreator.videoalliance.common.annotation.DataOut;
  14. import com.chinacreator.videoalliance.query.bean.IpInfoBean;
  15. import com.chinacreator.videoalliance.query.dao.QueryIPDao;
  16. @Controller
  17. public class QueryIPAction {
  18. @Autowired
  19. private QueryIPDao queryIPDao;
  20. @RequestMapping("/ipquery.do")
  21. @DataOut(callback="ipquery")
  22. public void ipquery(HttpServletRequest req, HttpServletResponse resp) throws Exception {
  23. resp.setCharacterEncoding("utf-8");
  24. resp.setContentType("text/json;charset=utf-8");
  25. PrintWriter out = resp.getWriter();
  26. DataOutPipe pipe = new DataOutPipe();
  27. //合作方ID
  28. String cpid = req.getParameter("cpid");
  29. //请求时间戳
  30. String timestamp = req.getParameter("timestamp");
  31. //签名验证
  32. String sign = req.getParameter("sign");
  33. //查询IP
  34. String ip = req.getParameter("ip");
  35. //判断参数不能为空
  36. if(cpid == null || "".equals(cpid.trim())){
  37. pipe.setResultCode("8102");
  38. pipe.setErrorInfo("cpid参数不能为空");
  39. out.write(pipe.toJSON());
  40. return;
  41. }
  42. if(timestamp == null || "".equals(timestamp.trim())){
  43. pipe.setResultCode("8102");
  44. pipe.setErrorInfo("timestamp参数不能为空");
  45. out.write(pipe.toJSON());
  46. return;
  47. }
  48. if(sign == null || "".equals(sign.trim())){
  49. pipe.setResultCode("8102");
  50. pipe.setErrorInfo("sign参数不能为空");
  51. out.write(pipe.toJSON());
  52. return;
  53. }
  54. //判断合作方信息
  55. IpInfoBean bean = new IpInfoBean();
  56. bean.setCpid(cpid);
  57. try {
  58. bean = queryIPDao.queryCpidForIp(bean);
  59. } catch (Exception e) {
  60. e.printStackTrace();
  61. pipe.setResultCode("506");
  62. pipe.setErrorInfo("数据库查询异常");
  63. out.write(pipe.toJSON());
  64. return;
  65. }
  66. if(bean == null){
  67. pipe.setResultCode("8102");
  68. pipe.setErrorInfo("cpid对应合作方不存在");
  69. out.write(pipe.toJSON());
  70. return;
  71. }
  72. //判断难是否正常
  73. String key = bean.getSignkey();
  74. if(!sign.equals(this.toSign(cpid, timestamp, key))){
  75. pipe.setResultCode("8805");
  76. pipe.setErrorInfo("sign验证不通过");
  77. out.write(pipe.toJSON());
  78. return;
  79. }
  80. //判断请求时间戳是否正常
  81. Date date = new Date();
  82. long timestampTemp = (date.getTime()/1000)+28800;
  83. long timestampVal = Long.parseLong(timestamp);
  84. if(timestampTemp-timestampVal>10L*60L || timestampTemp-timestampVal<-10L*60L){
  85. pipe.setResultCode("8806");
  86. pipe.setErrorInfo("timestamp不正常,不是当前时间");
  87. out.write(pipe.toJSON());
  88. return;
  89. }
  90. //判断是否上传IP
  91. if(ip == null || "".equals(ip.trim())){
  92. ip = this.getRealIp(req);
  93. if(ip == null || "".equals(ip.trim())){
  94. pipe.setResultCode("8801");
  95. pipe.setErrorInfo("不能取到客户端IP");
  96. out.write(pipe.toJSON());
  97. return;
  98. }
  99. }
  100. //判断IP是否格式正常
  101. String num = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
  102. String regex = "^" + num + "\\." + num + "\\." + num + "\\." + num + "$";
  103. if(!Pattern.matches(regex, ip)){
  104. pipe.setResultCode("8802");
  105. pipe.setErrorInfo("IP格式不正确");
  106. out.write(pipe.toJSON());
  107. return;
  108. }
  109. //查询IP的归属信息
  110. bean = new IpInfoBean();
  111. bean.setIp(ip);
  112. List<IpInfoBean> list = null;
  113. try {
  114. list = queryIPDao.queryIpInfo(bean);
  115. } catch (Exception e1) {
  116. e1.printStackTrace();
  117. pipe.setResultCode("506");
  118. pipe.setErrorInfo("数据库查询异常");
  119. out.write(pipe.toJSON());
  120. return;
  121. }
  122. if(list ==null || list.size()<1){
  123. try {
  124. bean.setIp(ip);
  125. bean.setCpid(cpid);
  126. bean.setId(cpid+new Date().getTime());
  127. queryIPDao.insertInfoNoQuery(bean);
  128. } catch (Exception e) {
  129. e.printStackTrace();
  130. }
  131. pipe.setResultCode("8803");
  132. pipe.setErrorInfo("IP未查询到归属信息");
  133. out.write(pipe.toJSON());
  134. return;
  135. }
  136. if(list.size()>1){
  137. pipe.setResultCode("8804");
  138. pipe.setErrorInfo("IP查询到多条归属信息");
  139. out.write(pipe.toJSON());
  140. return;
  141. }
  142. //IP归属信息
  143. IpInfoBean ipInfo = list.get(0);
  144. pipe.setResultCode("0");
  145. pipe.setErrorInfo("成功");
  146. pipe.add("ip", ip);
  147. pipe.add("country", ipInfo.getCountry());
  148. pipe.add("area", ipInfo.getArea());
  149. String op = ipInfo.getOperator();
  150. if(op==null || "".equals(op.trim())){
  151. op="未知";
  152. }
  153. pipe.add("operator", op);
  154. out.write(pipe.toJSON());
  155. }
  156. @RequestMapping("/clearIpCache.do")
  157. @DataOut(callback="clearIpCache")
  158. public void clearCache(HttpServletRequest req, HttpServletResponse resp) throws Exception {
  159. queryIPDao.clearCache();
  160. resp.setContentType("text/plain;charset=utf-8");
  161. resp.getWriter().write("ok");;
  162. }
  163. /**
  164. * 生成MD5签名
  165. *
  166. * @param cpid
  167. * @param timestamp
  168. * @param key
  169. * @return
  170. * @author 科创·毛燕龙
  171. * @datetime 2016年11月3日 下午8:16:40
  172. */
  173. private String toSign(String cpid,String timestamp,String key){
  174. String val=cpid+timestamp+key;
  175. return MD5.MD5Encode(val);
  176. }
  177. /**
  178. * 获取真实IP
  179. *
  180. * @param request
  181. * @return
  182. * @author 科创·毛燕龙
  183. * @datetime 2016年11月3日 下午8:17:02
  184. */
  185. private String getRealIp(HttpServletRequest request){
  186. String ip = request.getHeader("X-Forwarded-For") == null ? request
  187. .getHeader("x-forwarded-for") : request
  188. .getHeader("X-Forwarded-For");
  189. if (ip == null||ip.startsWith("10.") || ip.startsWith("172.")||ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  190. ip = request.getRemoteAddr();
  191. }
  192. if (ip == null||ip.startsWith("10.") || ip.startsWith("172.")||ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  193. ip = request.getHeader("Proxy-Client-IP");
  194. }
  195. if (ip == null||ip.startsWith("10.") ||ip.startsWith("172.")|| ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  196. ip = request.getHeader("WL-Proxy-Client-IP");
  197. }
  198. if(ip == null){
  199. return "";
  200. }
  201. String[] ips = ip.split(",");
  202. return ips[0];
  203. }
  204. }