Browse Source

open

master
pioneer 2 years ago
commit
5fcf87058d
  1. 8
      README.md
  2. BIN
      doc/JSD-9853-需求确认书V1.docx
  3. 31
      plugin.xml
  4. 12
      src/main/java/com/fr/plugin/AllOutHander.java
  5. 45
      src/main/java/com/fr/plugin/LogMacDBAccess.java
  6. 78
      src/main/java/com/fr/plugin/LogMacFilter.java
  7. 87
      src/main/java/com/fr/plugin/LogMacFunction.java
  8. 60
      src/main/java/com/fr/plugin/MultiReadHttpServletRequest.java
  9. 32
      src/main/java/com/fr/plugin/beans/UserLogBean.java
  10. 15
      src/main/java/com/fr/plugin/dao/LogDao.java
  11. 15
      src/main/java/com/fr/plugin/dao/RelationLogDao.java
  12. 59
      src/main/java/com/fr/plugin/entitys/AccessLogEntity.java
  13. 59
      src/main/java/com/fr/plugin/entitys/RelationLogEntity.java
  14. 1
      src/main/resources/com/fr/plugin/demo.properties
  15. 1
      src/main/resources/com/fr/plugin/demo_zh_CN.properties

8
README.md

@ -0,0 +1,8 @@
# open-JSD-
9853
JSD-9934 记录请求访问的mac地址\
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
仅作为开发者学习参考使用!禁止用于任何商业用途!\
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。

BIN
doc/JSD-9853-需求确认书V1.docx

Binary file not shown.

31
plugin.xml

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<plugin>
<id>com.fr.plugin.sln3425</id>
<name><![CDATA[记录mac地址-新]]></name>
<active>yes</active>
<version>1.6.3</version>
<env-version>10.0</env-version>
<jartime>2019-03-10</jartime>
<vendor>fr.open</vendor>
<description><![CDATA[记录mac地址]]></description>
<change-notes>
<![CDATA[
<p>[2019-6-4]项目启动</p>
<p>[2019-6-14]新增deviceName</p>
<p>[2022-03-18]修改拦截点
</p>
]]>
</change-notes>
<main-package>com.fr.plugin</main-package>
<function-recorder class="com.fr.plugin.LogMacFunction"/>
<extra-decision>
<GlobalRequestFilterProvider class="com.fr.plugin.LogMacFilter"/>
<HttpHandlerProvider class="com.fr.plugin.AllOutHander"/>
</extra-decision>
<extra-core>
<!--插件注入数据库-->
<DBAccessProvider class="com.fr.plugin.LogMacDBAccess"/>
</extra-core>
</plugin>

12
src/main/java/com/fr/plugin/AllOutHander.java

@ -0,0 +1,12 @@
package com.fr.plugin;
import com.fr.decision.fun.HttpHandler;
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider;
public class AllOutHander extends AbstractHttpHandlerProvider {
@Override
public HttpHandler[] registerHandlers() {
return new HttpHandler[]{
};
}
}

45
src/main/java/com/fr/plugin/LogMacDBAccess.java

@ -0,0 +1,45 @@
package com.fr.plugin;
import com.fr.plugin.dao.LogDao;
import com.fr.plugin.dao.RelationLogDao;
import com.fr.plugin.db.AbstractDBAccessProvider;
import com.fr.plugin.entitys.AccessLogEntity;
import com.fr.plugin.entitys.RelationLogEntity;
import com.fr.stable.db.accessor.DBAccessor;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.dao.DAOProvider;
public class LogMacDBAccess extends AbstractDBAccessProvider {
private static DBAccessor accessor;
public static DBAccessor getAccessor() {
return accessor;
}
@Override
public DAOProvider[] registerDAO() {
return new DAOProvider[]{
new DAOProvider() {
public Class getEntityClass() {
return RelationLogEntity.class;
}
public Class<? extends BaseDAO> getDAOClass() {
return LogDao.class;
}
},
new DAOProvider() {
public Class getEntityClass() {
return AccessLogEntity.class;
}
public Class<? extends BaseDAO> getDAOClass() {
return RelationLogDao.class;
}
}
};
}
@Override
public void onDBAvailable(DBAccessor dbAccessor) {
accessor = dbAccessor;
}
}

78
src/main/java/com/fr/plugin/LogMacFilter.java

@ -0,0 +1,78 @@
package com.fr.plugin;
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.decision.webservice.v10.login.LoginService;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.beans.UserLogBean;
import com.fr.plugin.entitys.RelationLogEntity;
import com.fr.stable.StringUtils;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.stream.Collectors;
public class LogMacFilter extends AbstractGlobalRequestFilterProvider {
@Override
public String filterName() {
return "logMac";
}
@Override
public String[] urlPatterns() {
return new String[]{
"/decision/login",
"/decision/v10/entry/access/*"
};
}
@Override
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) {
try {
MultiReadHttpServletRequest request = new MultiReadHttpServletRequest(req);
LogMacFunction myFunction = new LogMacFunction();
String uri = req.getRequestURI();
if (uri.contains("v10/entry/access")) {
String terminal = req.getHeader("terminal");
String op = req.getParameter("op");
String cmd = req.getParameter("cmd");
if ("APP".equals(terminal) && StringUtils.equals(op, "fs_main") && StringUtils.equals(cmd, "entry_report")) {
String name = LoginService.getInstance().getCurrentUserNameFromRequest(request);
RelationLogEntity relation = myFunction.findRelation(name);
if (relation != null) {
myFunction.addLoginHistory(relation);
FineLoggerFactory.getLogger().info("login app access log success " + relation.getUserName() + " " + relation.getMacAddr());
} else {
FineLoggerFactory.getLogger().info("login not find mac relation");
}
}
} else {
if ("POST".equalsIgnoreCase(req.getMethod())) {
String terminal = req.getHeader("terminal");
if ("APP".equals(terminal)) {
String body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
JSONObject json = new JSONObject(body);
UserLogBean bean = new UserLogBean();
if (json.has("username")) {
bean.setName(json.getString("username"));
}
if (json.has("deviceName")) {
bean.setDeviceName(json.getString("deviceName"));
}
if (json.has("macAddress")) {
bean.setMac(json.getString("macAddress"));
}
myFunction.save(bean);
}
FineLoggerFactory.getLogger().info("login with" + req.getHeaderNames());
}
}
filterChain.doFilter(request, res);
} catch (Exception e) {
e.printStackTrace();
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
}

87
src/main/java/com/fr/plugin/LogMacFunction.java

@ -0,0 +1,87 @@
package com.fr.plugin;
import com.fr.plugin.beans.UserLogBean;
import com.fr.plugin.dao.LogDao;
import com.fr.plugin.dao.RelationLogDao;
import com.fr.plugin.entitys.AccessLogEntity;
import com.fr.plugin.entitys.RelationLogEntity;
import com.fr.plugin.transform.ExecuteFunctionRecord;
import com.fr.plugin.transform.FunctionRecorder;
import com.fr.stable.db.accessor.DBAccessor;
import com.fr.stable.db.action.DBAction;
import com.fr.stable.db.dao.DAOContext;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.condition.QueryCondition;
import com.fr.stable.query.restriction.RestrictionFactory;
import com.fr.third.org.apache.commons.lang3.time.DateFormatUtils;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@FunctionRecorder(localeKey = "logmac")
public class LogMacFunction {
@ExecuteFunctionRecord
public void save(UserLogBean bean) throws Exception {
DBAccessor accessor = LogMacDBAccess.getAccessor();
RelationLogEntity logEntity = new RelationLogEntity();
logEntity.setTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
logEntity.setMacAddr(bean.getMac());
logEntity.setUserName(bean.getName());
logEntity.setDeviceName(bean.getDeviceName());
logEntity.setId(UUID.randomUUID().toString());
final RelationLogEntity count = accessor.runQueryAction(new DBAction<RelationLogEntity>() {
public RelationLogEntity run(DAOContext content) throws Exception {
QueryCondition queryCondition = QueryFactory.create();
queryCondition.addRestriction(RestrictionFactory.eq("userName", logEntity.getUserName()));
return content.getDAO(RelationLogDao.class).findOne(queryCondition);
}
});
accessor.runDMLAction(new DBAction<RelationLogEntity>() {
public RelationLogEntity run(DAOContext content) throws Exception {
if (count != null) {
count.setMacAddr(bean.getMac());
count.setDeviceName(bean.getDeviceName());
content.getDAO(RelationLogDao.class).update(count);
} else {
content.getDAO(RelationLogDao.class).add(logEntity);
}
return null;
}
});
}
public RelationLogEntity findRelation(String name) throws Exception {
DBAccessor accessor = LogMacDBAccess.getAccessor();
return accessor.runQueryAction(new DBAction<RelationLogEntity>() {
public RelationLogEntity run(DAOContext content) throws Exception {
QueryCondition queryCondition = QueryFactory.create();
queryCondition.addRestriction(RestrictionFactory.eq("userName", name));
return content.getDAO(RelationLogDao.class).findOne(queryCondition);
}
});
}
public void addLoginHistory(RelationLogEntity relation) throws Exception {
AccessLogEntity logEntity = new AccessLogEntity();
logEntity.setMacAddr(relation.getMacAddr());
logEntity.setUserName(relation.getUserName());
logEntity.setDeviceName(relation.getDeviceName());
logEntity.setId(UUID.randomUUID().toString());
logEntity.setTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd"));
DBAccessor accessor = LogMacDBAccess.getAccessor();
accessor.runDMLAction(new DBAction<RelationLogEntity>() {
public RelationLogEntity run(DAOContext content) throws Exception {
LogDao dao = content.getDAO(LogDao.class);
QueryCondition queryCondition = QueryFactory.create();
queryCondition.addRestriction(RestrictionFactory.eq("time", logEntity.getTime())).addRestriction(RestrictionFactory.eq("macAddr", logEntity.getMacAddr())).addRestriction(RestrictionFactory.eq("userName", logEntity.getUserName()));
List<AccessLogEntity> accessLogEntities = dao.find(queryCondition);
//如果不存在则插入,保障一天,一个用户,一个MAC只插入1条
if (accessLogEntities.isEmpty()) {
dao.add(logEntity);
}
return null;
}
});
}
}

60
src/main/java/com/fr/plugin/MultiReadHttpServletRequest.java

@ -0,0 +1,60 @@
package com.fr.plugin;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 二次封装请求避免获取了body之后无法继续处理请求
*/
public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {
public String _body;
public MultiReadHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
StringBuffer sBuffer = new StringBuffer();
BufferedReader bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
sBuffer.append(line);
}
_body = sBuffer.toString();
}
@Override
public ServletInputStream getInputStream() {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(_body.getBytes());
return new ServletInputStream() {
@Override
public int read() {
return byteArrayInputStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener listener) {
}
};
}
@Override
public BufferedReader getReader() {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
}

32
src/main/java/com/fr/plugin/beans/UserLogBean.java

@ -0,0 +1,32 @@
package com.fr.plugin.beans;
import java.io.Serializable;
public class UserLogBean implements Serializable {
private String name;
private String mac;
private String deviceName;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMac() {
return mac;
}
public void setMac(String mac) {
this.mac = mac;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
}

15
src/main/java/com/fr/plugin/dao/LogDao.java

@ -0,0 +1,15 @@
package com.fr.plugin.dao;
import com.fr.plugin.entitys.AccessLogEntity;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.session.DAOSession;
public class LogDao extends BaseDAO<AccessLogEntity> {
public LogDao(DAOSession daoSession) {
super(daoSession);
}
protected Class<AccessLogEntity> getEntityClass() {
return AccessLogEntity.class;
}
}

15
src/main/java/com/fr/plugin/dao/RelationLogDao.java

@ -0,0 +1,15 @@
package com.fr.plugin.dao;
import com.fr.plugin.entitys.RelationLogEntity;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.session.DAOSession;
public class RelationLogDao extends BaseDAO<RelationLogEntity> {
public RelationLogDao(DAOSession daoSession) {
super(daoSession);
}
protected Class<RelationLogEntity> getEntityClass() {
return RelationLogEntity.class;
}
}

59
src/main/java/com/fr/plugin/entitys/AccessLogEntity.java

@ -0,0 +1,59 @@
package com.fr.plugin.entitys;
import com.fr.stable.db.entity.BaseEntity;
import com.fr.stable.db.entity.TableAssociation;
import com.fr.third.javax.persistence.Column;
import com.fr.third.javax.persistence.Entity;
import com.fr.third.javax.persistence.Table;
@Entity
@Table(
name = "fine_access_log"
)
@TableAssociation(
associated = true
)
public class AccessLogEntity extends BaseEntity {
@Column(name = "userName")
private String userName = "";
@Column(name = "macAddr")
private String macAddr = "";
@Column(name = "deviceName")
private String deviceName = "";
@Column(name = "createTime")
private String time = "";
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getMacAddr() {
return macAddr;
}
public void setMacAddr(String macAddr) {
this.macAddr = macAddr;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}

59
src/main/java/com/fr/plugin/entitys/RelationLogEntity.java

@ -0,0 +1,59 @@
package com.fr.plugin.entitys;
import com.fr.stable.db.entity.BaseEntity;
import com.fr.stable.db.entity.TableAssociation;
import com.fr.third.javax.persistence.Column;
import com.fr.third.javax.persistence.Entity;
import com.fr.third.javax.persistence.Table;
import java.util.Date;
@Entity
@Table(
name = "fine_user_mac_relation"
)
@TableAssociation(
associated = true
)
public class RelationLogEntity extends BaseEntity {
@Column(name = "userName")
private String userName = "";
@Column(name = "macAddr")
private String macAddr = "";
@Column(name = "deviceName")
private String deviceName = "";
@Column(name = "createTime")
private String time = "";
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getMacAddr() {
return macAddr;
}
public void setMacAddr(String macAddr) {
this.macAddr = macAddr;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}

1
src/main/resources/com/fr/plugin/demo.properties

@ -0,0 +1 @@
Plugin-Test_Function_Abs=Test ABS

1
src/main/resources/com/fr/plugin/demo_zh_CN.properties

@ -0,0 +1 @@
Plugin-Test_Function_Abs=测试ABS函数
Loading…
Cancel
Save