1.背景
项目中有两个系统,一个认证系统,一个入学系统,在认证系统中有个单独做其他系统调用认证系统接口的模块,记录调用的接口url、时间、参数、ip等数据记录在一张表中,以备以后的数据分析。
2.实现思路
在认证系统web.xml配置文件中,配置拦截指定的接口。
<!--认证系统,接口管理模块拦截器 --> <filter> <filter-name>LogInterfaceFilter</filter-name> <filter-class>applice.filter.LogInterfaceFilter</filter-class> </filter> <filter-mapping> <filter-name>LogInterfaceFilter</filter-name> <url-pattern>/global/dataInterface/getTeacher.action</url-pattern> </filter-mapping>
在filter类中获取request参数并存入接口管理表中
package applice.filter; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import core.hibernate.HibernateBean; import core.hibernate.HibernateBeanFactory;public class LogInterfaceFilter implements Filter{ @Override public void destroy() {} @Override public void doFilter(ServletRequest req, ServletResponse rep, FilterChain chain) throws IOException, ServletException { //页面编码为GBK,此处需要设置request的编码与页面编码一致,否则会乱码 req.setCharacterEncoding("GBK"); HttpServletRequest request=(HttpServletRequest)req; //获取请求url String uri = request.getServletPath(); //获取请求端ip,如果有代理服务器,此方法无法获取到真实ip String ip = req.getRemoteAddr(); //公司框架封装的hibernate HibernateBean bean = HibernateBeanFactory.createBean(); Map<String, Object> map = new HashMap<String, Object>(); String sql="insert into log_interface(logId,interface,logTime,param,appId,ip) values(:logId,:interface,NOW(),:param,:appId,:ip)"; map.put("logId", UUID.randomUUID().toString().replace("-", "")); map.put("interface", uri); map.put("ip", ip); if(!string.isEmpty(req.getParameter("tokenId"))){ String appId = (String)req.getServletContext().getAttribute(req.getParameter("tokenId")); if(!string.isEmpty(appId)){ map.put("appId", appId); }else{ map.put("appId", ""); } }else{ map.put("appId", req.getParameter("appId")); } //request.getParameterMap获取请求参数Map集合 Map<String, String[]> param = req.getParameterMap(); //将请求参数通过jsonArray组装,存入接口表的参数字段中 JsonArray arr = new JsonArray(); for (String k : param.keySet()) { JsonObject obj = new JsonObject(); if(!k.equals("pageNumber") && !k.equals("pageSize")){ obj.addProperty(k,param.get(k)[0]); arr.add(obj); } } map.put("param", arr.toString()); bean.executeUpdate(sql, map); chain.doFilter(req, rep); } @Override public void init(FilterConfig arg0) throws ServletException {} }
