Springboot 日志管理模块编写记录
/**配置类
**/@Component
@Order(value=1)
public class MyApplicationRunner implements ApplicationRunner{
/*private static final Logger logger = LoggerFactory.getLogger(MyApplicationRunner.class);@Autowiredprivate MemoryService memoryService; @Overridepublic void run(ApplicationArguments args) throws Exception {logger.info("==服务启动后,初始化数据操作==");memoryService.getResources();}*/}
添加日志的配置类
package com.run.runlpwebdemo.config;import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.run.runlpwebdemo.bean.Log;
import com.run.runlpwebdemo.bean.Resource;
import com.run.runlpwebdemo.service.LogService;
import com.run.runlpwebdemo.service.MemoryService;@Aspect
@Component
public class WebLogAspect {private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate MemoryService memoryService;@Autowiredprivate LogService logService;@Pointcut("execution(public * com.run.runlpwebdemo.controller..*.*(..))")public void webLog() {}@Before("webLog()")public void doBefore(JoinPoint joinPoint) {// 接收到请求,记录请求内容logger.info("WebLogAspect.doBefore()");ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容logger.info("URL : " + request.getRequestURL().toString());logger.info("HTTP_METHOD : " + request.getMethod());logger.info("IP : " + request.getRemoteAddr());logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));saveLog(request);}private void saveLog(HttpServletRequest request) {Log log = new Log();String currentUrl = getCurrentURL(request);String parameterJson = getCurrentParameters(request); Resource resource = memoryService.getResource(currentUrl);//需要记录日志的资源则记录日志if(null!=resource&&resource.getIsLog()==1) {String description = "";description +=resource.getResourceName();if (StringUtils.hasText(parameterJson)) {description += (StringUtils.hasText(description) ? "," : "") + "参数:" + parameterJson;}log.setDescription(description);log.setUserIp(request.getRemoteAddr());String moduleName = memoryService.getModuleName(currentUrl);if (StringUtils.hasText(moduleName)) {log.setModuleName(moduleName);}logService.insert(log);}}/*** 获取当前url* * @return*/public String getCurrentURL(HttpServletRequest request) {String currentURL = request.getRequestURI();String contextPath = request.getContextPath();if (currentURL.startsWith(contextPath)) {currentURL = currentURL.replaceFirst(contextPath, "");}return currentURL;}/*** 获取当前请求参数的Json* * @return*/public String getCurrentParameters(HttpServletRequest request) {String parameterJson = "";ObjectMapper mapper = new ObjectMapper();Map<String, Object> map = new HashMap<>();Enumeration<?> parameterEnum = request.getParameterNames();while (parameterEnum.hasMoreElements()) {String paramName = (String) parameterEnum.nextElement();String[] values = request.getParameterValues(paramName);for (int i = 0; i < values.length; i++) {map.put(paramName, values);}}if (map.size() > 0) {try {parameterJson = mapper.writeValueAsString(map);} catch (JsonProcessingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return parameterJson;}}
Service层代码编写
package com.run.runlpwebdemo.service;import java.util.List;import com.run.runlpwebdemo.bean.Resource;/*** <p>Title:内存持久化服务接口</p> * <p>Description: </p>* <p>Copyright: Copyright (c) 2003 - 2014 </p>* <p>Company: Run Technology Co.Ltd. Beijing </p>* <p>bulid: 2014-4-30 下午03:41:43 </p>* @author 王松 E-mail:wangsong@bjrun.com* @version 1.0 */
public interface MemoryService {/*** 获取访问资源列表*/public List<Resource> getResources();/*** 根据Id获取访问资源* @param resourceId* @return*/public Resource getResource(int resourceId);/*** 刷新访问资源* @param resourceId*/public void flushResource(int resourceId);/*** 内存删除访问资源* @param resourceId*/public void removeResource(int resourceId);/*** 根据URL获取访问资源* @param url*/public Resource getResource(String url);/*** 判断url是否是公共资源* @param permissionUrl*/public boolean isCommon(String permissionUrl);/*** 判断url是否记录日志* @param roleId* @param permissionUrl*/public boolean isLog(String permissionUrl);/*** 获取模块名称* @param permissionUrl*/public String getModuleName(String permissionUrl);}
serviceImp代码层的编写
package com.run.runlpwebdemo.service.impl;import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.run.runlpwebdemo.bean.Resource;
import com.run.runlpwebdemo.constant.Memory;
import com.run.runlpwebdemo.constant.MemoryKey;
import com.run.runlpwebdemo.dao.ResourceDao;
import com.run.runlpwebdemo.query.ResourceQuery;
import com.run.runlpwebdemo.service.MemoryService;
import com.run.runlpwebdemo.utils.StringUtil;/*** <p>* Title:内存持久化服务方法* </p>* <p>* Description:* </p>* <p>* Copyright: Copyright (c) 2003 - 2014* </p>* <p>* Company: Run Technology Co.Ltd. Beijing* </p>* <p>* bulid: 2014-4-30 下午03:12:41* </p>* * @author 王松 E-mail:wangsong@bjrun.com* @version 1.0*/
@Service("memoryService")
public class MemoryServiceImpl implements MemoryService{@Autowiredprivate ResourceDao resourceDao;/*** 获取访问资源列表*/public List<Resource> getResources() {String key = MemoryKey.RESOURCE_ALLID_KEY;String resourceIds = "";List<Resource> resources = new ArrayList<Resource>();String resourceKey = "";if (Memory.containsKey(key)) {resourceIds = (String) Memory.get(key);if (StringUtils.hasText(resourceIds)) {Resource resource = null;int[] rIds = StringUtil.getIds(resourceIds);for (int resourceId : rIds) {resourceKey = MemoryKey.RESOURCE_ID_PREFIX + resourceId;resource = (Resource) Memory.get(resourceKey);if (resource != null) {resources.add(resource);}}}} else {// 资源没有内存持久化ResourceQuery query = new ResourceQuery();query.setPage(false);resources = resourceDao.getResources(query);// 读取全部资源if (resources != null && resources.size() > 0) {for (Resource resource : resources) {resourceIds += (StringUtils.hasText(resourceIds) ? "," : "")+ resource.getResourceId();resourceKey = MemoryKey.RESOURCE_ID_PREFIX + resource.getResourceId();Memory.put(resourceKey, resource);resourceKey = MemoryKey.RESOURCE_URL_PREFIX + resource.getUrl();Memory.put(resourceKey, resource);}}}return resources;}/*** 根据Id获取访问资源* * @param resourceId* @return*/public Resource getResource(int resourceId) {String key = MemoryKey.RESOURCE_ID_PREFIX + resourceId;Resource resource = null;if (Memory.containsKey(key)) {resource = (Resource) Memory.get(key);} else {resource = resourceDao.getResource(resourceId);Memory.put(key, resource);if (resource != null) {key = MemoryKey.RESOURCE_URL_PREFIX + resource.getUrl();Memory.put(key, resource);}}return resource;}/*** 刷新访问资源* * @param resourceId*/public void flushResource(int resourceId) {removeResource(resourceId);getResource(resourceId);}/*** 内存删除访问资源* * @param resourceId*/public void removeResource(int resourceId) {String key = MemoryKey.RESOURCE_ID_PREFIX + resourceId;Resource resource = getResource(resourceId);if (Memory.containsKey(key)) {Memory.remove(key);}if (resource != null) {key = MemoryKey.RESOURCE_URL_PREFIX + resource.getUrl();if (Memory.containsKey(key)) {Memory.remove(key);}}}/*** 根据URL获取访问资源* * @param url*/public Resource getResource(String url) {String key = MemoryKey.RESOURCE_URL_PREFIX + url;Resource resource = null;if (Memory.containsKey(key)) {resource = (Resource) Memory.get(key);} else {ResourceQuery query = new ResourceQuery();query.setPage(false);query.setUrl(url);List<Resource> resources = resourceDao.getResources(query);// 读取资源if (resources != null && resources.size() > 0) {resource = resources.get(0);Memory.put(key, resource);key = MemoryKey.RESOURCE_ID_PREFIX + resource.getResourceId();Memory.put(key, resource);}}return resource;}/*** 判断url是否是公共资源* * @param permissionUrl*/public boolean isCommon(String permissionUrl) {boolean rtn = false;Resource resource = getResource(permissionUrl);if (resource != null) {if (resource.getIsCommon() == 1) {rtn = true;}}return rtn;}/*** 判断url是否记录日志* * @param permissionUrl*/public boolean isLog(String permissionUrl) {boolean rtn = false;Resource resource = getResource(permissionUrl);if (resource != null) {if (resource.getIsLog() == 1) {rtn = true;}}return rtn;}/*** 获取模块名称* * @param permissionUrl*/public String getModuleName(String permissionUrl) {String moduleName = "";Resource resource = getResource(permissionUrl);if (resource != null) {if (resource.getIsNav() == 1) {moduleName = resource.getResourceName();} else {resource = getResource(resource.getParentId());if (resource != null) {if (resource.getIsNav() == 1) {moduleName = resource.getResourceName();}}}}return moduleName;}
}
Mapper映射文件以及Dao编写
package com.run.runlpwebdemo.dao;import java.util.List;import org.springframework.stereotype.Repository;import com.run.runlpwebdemo.bean.Resource;
import com.run.runlpwebdemo.query.ResourceQuery;/*** <p>Title:访问资源DAO方法</p> * <p>Description: </p>* <p>Copyright: Copyright (c) 2018 - 2028 </p>* <p>Company: Run Technology Co.Ltd. Beijing </p>* <p>bulid: 2018-7-20 下午03:12:41 </p>* @author * @version 1.0 */
//@Repository
public interface ResourceDao {/*** 主键查询访问资源* @param resourceId* @return*/public Resource getResource(int resourceId);/*** 复杂条件查询访问资源* @param query 包含查询和排序条件* @return*/public List<Resource> getResources(ResourceQuery query);}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.run.runlpwebdemo.dao.ResourceDao"><!-- 访问资源表--><sql id="RESOURCE_TABLE">SYS_RESOURCE</sql><!-- 资源查询条件 --><sql id="sqlFilter"><trim prefix="where" prefixOverrides="and |or"> <if test="updateResourceId != null and updateResourceId != 0"> <![CDATA[R.RESOURCE_ID<>#{updateResourceId}]]> </if><if test="keyword != null and keyword != ''"> AND R.RESOURCE_NAME LIKE '%'||#{keyword}||'%'</if><if test="parentIds != null"> R.PARENT_ID in <foreach item="item" index="index" collection="parentIds" open="(" separator="," close=")">#{item}</foreach></if><if test="resourceName != null and resourceName != ''"> AND R.RESOURCE_NAME=''||#{resourceName}||''</if><if test="parentId != null and parentId >= 0"> AND R.PARENT_ID=#{parentId} </if> <if test="url != null and url != ''"> AND R.URL=''||#{url}||''</if><if test="isCommon != null and isCommon >= 0"> AND R.IS_COMMON=#{isCommon} </if><if test="isNav != null and isNav >= 0"> AND R.IS_NAV=#{isNav} </if><if test="isButton != null and isButton >= 0"> AND R.IS_BUTTON=#{isButton} </if><if test="navNum != null and navNum > 0"> AND R.NAV_NUM=#{navNum} </if><if test="isRoleResource != null and isRoleResource == 1"> <![CDATA[AND R.RESOURCE_ID > 1]]> </if></trim></sql><!-- 主键查询 --><select id="getResource" parameterType="int" resultType="com.run.runlpwebdemo.bean.Resource">SELECT R.RESOURCE_ID, R.RESOURCE_NAME, R.PARENT_ID, R.URL, R.IS_COMMON, R.IS_NAV, R.IS_BUTTON, R.IS_LOG, R.NAV_NUMFROM <include refid="RESOURCE_TABLE"/> RWHERE R.RESOURCE_ID=#{resourceId}</select><!-- 条件查询--><select id="getResources" parameterType="com.run.runlpwebdemo.query.ResourceQuery" resultType="com.run.runlpwebdemo.bean.Resource"><if test="isPage">SELECT * FROM (SELECT TABLE_A.*,ROWNUM AS MY_ROWNUM FROM (</if>SELECT R.RESOURCE_ID, R.RESOURCE_NAME, R.PARENT_ID, R.URL, R.IS_COMMON, R.IS_NAV, R.IS_BUTTON, R.IS_LOG, R.NAV_NUMFROM <include refid="RESOURCE_TABLE"/> R<include refid="sqlFilter"/><if test="orderField != null and orderField != ''">ORDER BY ${orderField}<if test="orderField != null and orderField != ''">${orderType}</if></if> <if test="isPage"><![CDATA[ ) TABLE_A WHERE ROWNUM <= #{maxnum} ) WHERE MY_ROWNUM > #{minnum} ]]></if></select></mapper>
相关文章:

IEs 4 Linux 新版支撑 IE 7
Toy Posted in AppsIEs 4 Linux 可以让在 Linux 上安插 IE 变成一件异常俭省和高兴的事。昨天发布的 IEs 4 Linux 2.1 beta2 版末尾支撑安插 IE 7 了。不过,需求使用 –beta-install-ie7 的下令行选项来激活。据作者称,在 Linux 安插的 IE 7,…

h3c 3600 acl 配置 滤源IP是网关的ARP报文的ACL规则
h3c 3600 acl 配置 滤源IP是网关的ARP报文的ACL规则 悬赏分:100 - 解决时间:2009-3-8 14:30 星号之间是我在网上查到的华为交换机的配置方法: ************************************************ 全局配置ACL禁止所有源IP是网关的ARP报文 acl…

useradd与adduser的区别
useradd与adduser都是创建新的用户 在CentOs下useradd与adduser是没有区别的都是在创建用户,在home下自动创建目录,没有设置密码,需要使用passwd命令修改密码。 注:有朋友在博客园上回复我说 centos adduser 不创建用户home目录…

入门linux
作者:opmetic 出自: http://www.linuxdiyf.com说到入门linux ,仍是在大二的时辰,由于插手了黉舍的一个比赛举动,是在linux下的一个顺序匹敌,以是在自己的机子上装了一个RedHat9。厥后风闻它没有更新版本了,接着黉舍检…

springboot之异步调用@Async
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.…

js将字符串作为函数名调用函数
需求:获取JSON对象的函数名称,并执行该函数。 解决:用eval函数,字符串转换为命令行执行都可以通过eval函数。 计算 JavaScript 字符串,并把它作为脚本代码来执行。 function loadForm(itemCode){for(var i0;i<ITEM…

2010网络营销-电子商务厦门峰会即将开幕
曾几何时,安踏、361度等福建晋江企业通过在央视大规模投放广告使企业的知名度得到迅速提升,产品销量也节节攀升。如今,大批福建企业又把营销的战场转向了互联网,如何在互联网这个营销新战场续写辉煌成了众多福建企业当前最关心的问…

百度前端技术学院js任务三
任务地址:http://ife.baidu.com/course/detail/id/98 代码: 1 <!DOCTYPE>2 <html>3 <head>4 <meta charset"utf-8">5 <title>IFE JavaScript Task 01</title>6 </head>7 <body>8…

开源分布式Job系统,调度与业务分离-如何创建一个计划HttpJob任务
项目介绍: Hangfire:是一个开源的job调度系统,支持分布式JOB!! Hangfire.HttpJob 是我针对Hangfire开发的一个组件,该组件和Hangfire本身是独立的。可以独立更新Hangfire版本不影响! 该组件已被Hangfire官方采纳&#…

小手段:开启 GNOME 的窗口分组效果
Toy Posted in Tips用过 Windows XP 的伴侣除夜要都晓得它有一项分组雷同义务栏按钮的效果,该效果主动将同类窗口的义务按钮折叠为一个单独的按钮,从而无效处置义务栏的窗口拥堵后果。其实,在 Linux 的 GNOME 桌面情况中也有雷同的效果──窗…

MySQL设值自动修改时间
ALTER TABLE form_ylqx ADD update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 修改时间

[原]不祥的CPU——Alpha
这几天都在捣鼓 Sun Fire V890 小型机,小型机可不像PC服务器那样“不一样的品牌,一样的芯”,不同的品牌的小型机最大的不同当数CPU和OS了,IBM小型机CPU是Power而OS是AIX,HP小型机的CPU是Intel的Itanium而OS是HP-UX&…

Leetcode 764. Largest Plus Sign
思路:动态规划。对于第i行第j列的元素grid[i][j]表示的是这个元素的plus sign的等级,初始化不在mines中的元素对应的grid值为较大值(只要大于N/2即可),在mines中的元素对应的grid值为0。不在mines中的元素,…

吴裕雄--天生自然 JAVASCRIPT开发学习:(String) 对象
<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><script> var carname1"Volvo XC60"; var carname2Volvo XC60; var answer1It\s al…

校园音乐点歌平台的设计与开发 微信小程序 点歌系统 java 开发
1、 微信小程序前台展示 2 、 使用到的技术框架 Springbootmavenmybatis网易云相关API 3、 后台展示 项目地址: 项目地址

Tile Racer — 3D 赛车游戏
Toy Posted in Tile Racer 是一款可免用度于 Linux 及 Windows 平台的 3D 赛车游戏。它不只具有十分逼真的效果,并且包罗用来创设新 Maps 的赛道编辑器。玩家可置身于游戏之中足够觉获得赛车的快乐喜爱。Tile Racer 此后最新版本为 0.6,你可以从这里下载…

如何找寻最适合的WEB应用安全解决方案(视频)
51CTO最近举办了一个“拯救网站运维经理赵明”的活动,活动主要讲了一个网站运维经理由于网站被黑而面临失业的故事。其中急需解决的问题,就是如何保护我们的网站。Web应用安全该如何做?怎么才能找到最佳方案?我们就这一主题来采访…

docker 笔记 (6)搭建本地registry
转:http://blog.csdn.net/felix_yujing/article/details/51564739 新版 registry v2对镜像存储格式进行了重新设计,并且和旧版还不兼容。registry v2是由go语言开发,docker从1.6版本开始支持registry v2,之前python开发的老版regi…

2019攻防世界web新手区
robots 看了题目描述,发现与robots协议有关,过完去百度robots协议。发现了robots.txt,然后去构造url访问这个文件 http://111.198.29.45:42287/robots.txt 得到提示:Disallow: f1ag_1s_h3re.php,再次构造url࿰…

SSM实现网上商城 有聊天功能
1.项目介绍 实现一个网上商城,商品信息展示,购物车,订单管理,个人中心,商品评价,商品搜索,地址管理,聊天,后台管理(商品增删改查),分类…

as3中TextFormat类的使用
在AS3中对TextField进行格式化时可以有三种方法:html标签控制格式css使用TextFormathtml比较方便,但很有限,CSS可以外置维护比较容易,但缺少变化,TextFormat可以复杂多变,只是写起来比较麻烦,并…

pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。
渣渣用法,请等待我心情好的时候更新。 1.第一个例子 1.1 先看mainwindow.py from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(640, 320…

linux secureCRT 显示中文乱码
安装的时候,只安装了英文,没有安装中文,所以只有en_US.UTF-8.因为linux本身就支持多语言,所以我们只需要在光盘 上找到2个中文支持字体包安装上即可.这两个字体文件是存放在第四张光盘上的Servers目录下: fonts-chines…

PicGo 配置Gitee 图床
目录 1.下载安装picGo 2.打开picGo详情页面 3.创建gitee图床库 4. 配置picGo 5.获取gitee token信息 6.与typora搭配使用 1.下载安装picGo 百度picgo csdn下载地址:https://download.csdn.net/download/huyande123/12582917 2.打开picGo详情页面 3.创建gitee图床库 …

文件夹内多文件上传到服务器
文件夹上传至服务器希望可以给你一点帮助 直接上代码jsp页面 <div style"text-align:center; vertical-align:middel" id"uploadFile"> <input type"file" name"file" id"file" multiple"multiple" webk…

【Socket研究】~。~ Scoket开发蛋疼笔记 Silverlight
客户端连接步骤【Silverlight】 【注意】 Silverlight 客户端 记得一定是异步连接。 一。连接步骤 1.实例一个Scoket 2.实例套接字 SocketAsyncEventArgs 3.给套接字载入连接信息 4.载入异步方法转载于:https://www.cnblogs.com/manbaal/archive/2011/03/08/1977521.html

通知:正式迁移至新博客
博客迁移这事情已经有一段时间了,不过最近发现似乎还有许多朋友不知道这点,以为我怎么不写博客了——其实我还在写,写的还挺勤快的,只不过已经不继续同步到博客园了。这事儿说来也很遗憾,原本我打算两边同步更新&#…

java中别名问题
Java中别名问题 Java中涉及到对象引用时常常出现意想不到得问题直接将一个对象赋值给另一个对象时 改变另一个对象 开始的那个对象也出现改变class Person{private int age;public int getAge() {return age;}public void setAge(int age) {this.age age;}} 对于对象Person做如…

中国挪动批改KPI查核制度将器重客户满意度
飞象网讯(魏德龄/文)记者从相关动静处置解到,中国挪动2011年的KPI查核将大幅缩减,并消除数据业务、TD用户数和集体客户等目标,重点调高了利润和客户满意度目标,并加入了相关EVA财务目标查核。去年ÿ…

ElasticSearch安装使用 操作索引
文章目录1.下载并安装2.了解es的配置文件**elasticsearch-.yml**(中文配置详解)3.使用head插件1.使用谷歌浏览器head插件2.使用压缩中的head程序4.使用kibana(安装)1.什么是kibana2.kibana国际化,将kibana设值成中文3.启动(es先启…