diff --git a/sql/ry_20180526.sql b/sql/ry_20180526.sql index f40bca2eb..e0070bc38 100644 --- a/sql/ry_20180526.sql +++ b/sql/ry_20180526.sql @@ -372,6 +372,7 @@ create table sys_oper_log ( dept_name varchar(50) default '' comment '部门名称', oper_url varchar(255) default '' comment '请求URL', oper_ip varchar(30) default '' comment '主机地址', + oper_location varchar(255) default '' comment '操作地点', oper_param varchar(255) default '' comment '请求参数', status int(1) default 0 comment '操作状态 0正常 1异常', error_msg varchar(2000) default '' comment '错误消息', @@ -475,6 +476,7 @@ create table sys_logininfor ( info_id int(11) not null auto_increment comment '访问ID', login_name varchar(50) default '' comment '登录账号', ipaddr varchar(50) default '' comment '登录IP地址', + login_location varchar(255) default '' comment '登录地点', browser varchar(50) default '' comment '浏览器类型', os varchar(50) default '' comment '操作系统', status int(1) default 0 comment '登录状态 0成功 1失败', @@ -493,6 +495,7 @@ create table sys_user_online ( login_name varchar(50) default '' comment '登录账号', dept_name varchar(50) default '' comment '部门名称', ipaddr varchar(50) default '' comment '登录IP地址', + login_location varchar(255) default '' comment '登录地点', browser varchar(50) default '' comment '浏览器类型', os varchar(50) default '' comment '操作系统', status varchar(10) default '' comment '在线状态on_line在线off_line离线', diff --git a/src/main/java/com/ruoyi/common/utils/AddressUtils.java b/src/main/java/com/ruoyi/common/utils/AddressUtils.java new file mode 100644 index 000000000..89cf38dfc --- /dev/null +++ b/src/main/java/com/ruoyi/common/utils/AddressUtils.java @@ -0,0 +1,174 @@ +package com.ruoyi.common.utils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * 获取地址类 + */ +public class AddressUtils { + public static String getAddresses(String content, String encodingString) throws UnsupportedEncodingException { + /** 根据IP查询地址 http://ip.taobao.com/service/getIpInfo.php?ip=111.111.111.111*/ + String urlStr = "http://ip.taobao.com/service/getIpInfo.php"; + String returnStr = getResult(urlStr, content, encodingString); + if (returnStr != null) { + returnStr = decodeUnicode(returnStr); + String[] temp = returnStr.split(","); + if (temp.length < 3) { + return "0"; + } + return returnStr; + } + return null; + } + + /** + * 获取查询结果 + * @param urlStr + * @param content + * @param encoding + * @return + */ + private static String getResult(String urlStr, String content, String encoding) { + URL url = null; + HttpURLConnection connection = null; + try { + url = new URL(urlStr); + connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(2000); + connection.setReadTimeout(2000); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setRequestMethod("POST"); + connection.setUseCaches(false); + connection.connect(); + DataOutputStream out = new DataOutputStream(connection.getOutputStream()); + out.writeBytes(content); + out.flush(); + out.close(); + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding)); + StringBuffer buffer = new StringBuffer(); + String line = ""; + while ((line = reader.readLine()) != null) { + buffer.append(line); + } + reader.close(); + return buffer.toString(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (connection != null) { + connection.disconnect(); + } + } + return null; + } + + /** + * + * @param theString + * @return + */ + public static String decodeUnicode(String theString) { + char aChar; + int len = theString.length(); + StringBuffer outBuffer = new StringBuffer(len); + for (int x = 0; x < len;) { + aChar = theString.charAt(x++); + if (aChar == '\\') { + aChar = theString.charAt(x++); + if (aChar == 'u') { + int value = 0; + for (int i = 0; i < 4; i++) { + aChar = theString.charAt(x++); + switch (aChar) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + value = (value << 4) + aChar - '0'; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + value = (value << 4) + 10 + aChar - 'a'; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + value = (value << 4) + 10 + aChar - 'A'; + break; + default: + throw new IllegalArgumentException("Malformed encoding."); + } + } + outBuffer.append((char) value); + } else { + if (aChar == 't') { + aChar = '\t'; + } else if (aChar == 'r') { + aChar = '\r'; + } else if (aChar == 'n') { + aChar = '\n'; + } else if (aChar == 'f') { + aChar = '\f'; + } + outBuffer.append(aChar); + } + } else { + outBuffer.append(aChar); + } + } + return outBuffer.toString(); + } + + public static String getRealAddressByIP(String ip) { + String address = ""; + try { + + address = getAddresses("ip=" + ip, "utf-8"); + + ////把JSON文本parse成JSONObject,通俗就是把json文本转为json对象 + JSONObject json= JSONObject.parseObject(address); + + //通过其get的方法来获取data的value由于返回的是object对象,而data的value本身又是json字符串,所以我们可以进行强转 + JSONObject object = (JSONObject)json.get("data"); + String country=object.getString("country"); + String region = object.getString("region"); + String city = object.getString("city"); + address = country+""+region + "" + city; + } catch (Exception e) { + + } + return address; + } + + public static void main(String[] args) { + try { + System.out.println(getAddresses("ip=111.85.32.37","utf-8")); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + System.out.println(getRealAddressByIP("111.85.32.37")); + } +} diff --git a/src/main/java/com/ruoyi/common/utils/IpUtils.java b/src/main/java/com/ruoyi/common/utils/IpUtils.java index e28b6f63f..6127b24cf 100644 --- a/src/main/java/com/ruoyi/common/utils/IpUtils.java +++ b/src/main/java/com/ruoyi/common/utils/IpUtils.java @@ -37,6 +37,7 @@ public class IpUtils { ip = request.getRemoteAddr(); } - return ip; + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; } } diff --git a/src/main/java/com/ruoyi/common/utils/SystemLogUtils.java b/src/main/java/com/ruoyi/common/utils/SystemLogUtils.java index 20dc51b5c..ab8803c60 100644 --- a/src/main/java/com/ruoyi/common/utils/SystemLogUtils.java +++ b/src/main/java/com/ruoyi/common/utils/SystemLogUtils.java @@ -33,6 +33,7 @@ public class SystemLogUtils { StringBuilder s = new StringBuilder(); s.append(LogUtils.getBlock(ShiroUtils.getIp())); + s.append(AddressUtils.getRealAddressByIP(ShiroUtils.getIp())); s.append(LogUtils.getBlock(username)); s.append(LogUtils.getBlock(status)); s.append(LogUtils.getBlock(msg)); @@ -61,6 +62,7 @@ public class SystemLogUtils logininfor.setLoginName(username); logininfor.setStatus(status); logininfor.setIpaddr(ShiroUtils.getIp()); + logininfor.setLoginLocation(AddressUtils.getRealAddressByIP(ShiroUtils.getIp())); logininfor.setBrowser(browser); logininfor.setOs(os); logininfor.setMsg(message); diff --git a/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index 8fe404266..89072c112 100644 --- a/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -3,6 +3,7 @@ package com.ruoyi.framework.aspectj; import java.lang.reflect.Method; import java.util.Map; +import com.ruoyi.common.utils.AddressUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.AfterReturning; @@ -72,7 +73,7 @@ public class LogAspect } @Async - private void handleLog(final JoinPoint joinPoint, final Exception e) + protected void handleLog(final JoinPoint joinPoint, final Exception e) { try { @@ -92,6 +93,9 @@ public class LogAspect // 请求的地址 String ip = ShiroUtils.getIp(); operLog.setOperIp(ip); + //操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(ip)); + operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); if (currentUser != null) { diff --git a/src/main/java/com/ruoyi/project/monitor/logininfor/domain/Logininfor.java b/src/main/java/com/ruoyi/project/monitor/logininfor/domain/Logininfor.java index dcc71a4f3..c10533ccd 100644 --- a/src/main/java/com/ruoyi/project/monitor/logininfor/domain/Logininfor.java +++ b/src/main/java/com/ruoyi/project/monitor/logininfor/domain/Logininfor.java @@ -1,8 +1,9 @@ package com.ruoyi.project.monitor.logininfor.domain; -import java.util.Date; import com.ruoyi.framework.web.domain.BaseEntity; +import java.util.Date; + /** * 系统访问日志情况信息 sys_logininfor * @@ -19,6 +20,8 @@ public class Logininfor extends BaseEntity private String status; /** 登录IP地址 */ private String ipaddr; + /**登录地点*/ + private String loginLocation; /** 浏览器类型 */ private String browser; /** 操作系统 */ @@ -68,6 +71,14 @@ public class Logininfor extends BaseEntity this.ipaddr = ipaddr; } + public String getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + public String getBrowser() { return browser; @@ -112,7 +123,7 @@ public class Logininfor extends BaseEntity public String toString() { return "Logininfor [infoId=" + infoId + ", loginName=" + loginName + ", status=" + status + ", ipaddr=" + ipaddr - + ", browser=" + browser + ", os=" + os + ", msg=" + msg + ", loginTime=" + loginTime + "]"; + + ",loginLocation="+loginLocation+", browser=" + browser + ", os=" + os + ", msg=" + msg + ", loginTime=" + loginTime + "]"; } } \ No newline at end of file diff --git a/src/main/java/com/ruoyi/project/monitor/online/domain/UserOnline.java b/src/main/java/com/ruoyi/project/monitor/online/domain/UserOnline.java index c432c4d6b..7ace787ef 100644 --- a/src/main/java/com/ruoyi/project/monitor/online/domain/UserOnline.java +++ b/src/main/java/com/ruoyi/project/monitor/online/domain/UserOnline.java @@ -1,9 +1,11 @@ package com.ruoyi.project.monitor.online.domain; -import java.util.Date; +import com.ruoyi.common.utils.AddressUtils; import com.ruoyi.framework.web.domain.BaseEntity; import com.ruoyi.project.monitor.online.domain.OnlineSession.OnlineStatus; +import java.util.Date; + /** * 当前在线会话 sys_user_online * @@ -24,6 +26,9 @@ public class UserOnline extends BaseEntity /** 登录IP地址 */ private String ipaddr; + /**登录地址*/ + private String longinLocation; + /** 浏览器类型 */ private String browser; @@ -58,6 +63,7 @@ public class UserOnline extends BaseEntity online.setLastAccessTime(session.getLastAccessTime()); online.setExpireTime(session.getTimeout()); online.setIpaddr(session.getHost()); + online.setLonginLocation(AddressUtils.getRealAddressByIP(session.getHost())); online.setBrowser(session.getBrowser()); online.setOs(session.getOs()); online.setStatus(session.getStatus()); @@ -105,6 +111,14 @@ public class UserOnline extends BaseEntity this.ipaddr = ipaddr; } + public String getLonginLocation() { + return longinLocation; + } + + public void setLonginLocation(String longinLocation) { + this.longinLocation = longinLocation; + } + public String getBrowser() { return browser; diff --git a/src/main/java/com/ruoyi/project/monitor/operlog/domain/OperLog.java b/src/main/java/com/ruoyi/project/monitor/operlog/domain/OperLog.java index c555e1ac6..762581d8c 100644 --- a/src/main/java/com/ruoyi/project/monitor/operlog/domain/OperLog.java +++ b/src/main/java/com/ruoyi/project/monitor/operlog/domain/OperLog.java @@ -1,8 +1,9 @@ package com.ruoyi.project.monitor.operlog.domain; -import java.util.Date; import com.ruoyi.framework.web.domain.BaseEntity; +import java.util.Date; + /** * 操作日志记录 oper_log * @@ -29,6 +30,8 @@ public class OperLog extends BaseEntity private String operUrl; /** 操作地址 */ private String operIp; + /** 操作地点*/ + private String operLocation; /** 请求参数 */ private String operParam; /** 状态0正常 1异常 */ @@ -128,6 +131,14 @@ public class OperLog extends BaseEntity this.operIp = operIp; } + public String getOperLocation() { + return operLocation; + } + + public void setOperLocation(String operLocation) { + this.operLocation = operLocation; + } + public String getOperParam() { return operParam; @@ -173,7 +184,7 @@ public class OperLog extends BaseEntity { return "OperLog [operId=" + operId + ", title=" + title + ", action=" + action + ", method=" + method + ", channel=" + channel + ", loginName=" + loginName + ", deptName=" + deptName + ", operUrl=" - + operUrl + ", operIp=" + operIp + ", operParam=" + operParam + ", status=" + status + ", errorMsg=" + + operUrl + ", operIp=" + operIp + ", operLocation=" + operLocation + ", operParam=" + operParam + ", status=" + status + ", errorMsg=" + errorMsg + ", operTime=" + operTime + "]"; } diff --git a/src/main/resources/mybatis/monitor/LogininforMapper.xml b/src/main/resources/mybatis/monitor/LogininforMapper.xml index 1069f54ec..2b0e41f5e 100644 --- a/src/main/resources/mybatis/monitor/LogininforMapper.xml +++ b/src/main/resources/mybatis/monitor/LogininforMapper.xml @@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -16,8 +17,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - insert into sys_logininfor (login_name, status, ipaddr, browser, os, msg, login_time) - values (#{loginName}, #{status}, #{ipaddr}, #{browser}, #{os}, #{msg}, sysdate()) + insert into sys_logininfor (login_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{loginName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) - replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, browser, os, status, start_timestsamp, last_access_time, expire_time) - values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime}) + replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestsamp, last_access_time, expire_time) + values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{longinLocation}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime}) diff --git a/src/main/resources/mybatis/monitor/OperLogMapper.xml b/src/main/resources/mybatis/monitor/OperLogMapper.xml index ea56ee851..835c58eda 100644 --- a/src/main/resources/mybatis/monitor/OperLogMapper.xml +++ b/src/main/resources/mybatis/monitor/OperLogMapper.xml @@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -21,8 +22,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - insert into sys_oper_log(title, action, method, channel, login_name, dept_name, oper_url, oper_ip, oper_param, status, error_msg, oper_time) - values (#{title}, #{action}, #{method}, #{channel}, #{loginName}, #{deptName}, #{operUrl}, #{operIp}, #{operParam}, #{status}, #{errorMsg}, sysdate()) + insert into sys_oper_log(title, action, method, channel, login_name, dept_name, oper_url, oper_ip, oper_location, oper_param, status, error_msg, oper_time) + values (#{title}, #{action}, #{method}, #{channel}, #{loginName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{status}, #{errorMsg}, sysdate())