问题是,原来系统有日志操作的代码,但日志最终没有存到数据库。

xml中拦截器配置:

        <mvc:interceptor>
<mvc:mapping path="/admin/**" />
<bean id="logInterceptor" class="com.store.interceptor.LogInterceptor" />
</mvc:interceptor>

LogInterceptor:

    @Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception
{
List<LogConfig> logConfigs = logConfigService.getAll();
if (logConfigs != null)
{
String path = request.getServletPath();
for (LogConfig logConfig : logConfigs)
{
if (antPathMatcher.match(logConfig.getUrlPattern(), path))
{
String username = adminService.getCurrentUsername();
String operation = logConfig.getOperation();
String operator = username;
String content = (String) request
.getAttribute(Log.LOG_CONTENT_ATTRIBUTE_NAME);
String ip = request.getRemoteAddr();
request.removeAttribute(Log.LOG_CONTENT_ATTRIBUTE_NAME);
StringBuffer parameter = new StringBuffer();
Map<String, String[]> parameterMap = request
.getParameterMap();
if (parameterMap != null)
{
for (Entry<String, String[]> entry : parameterMap
.entrySet())
{
String parameterName = entry.getKey();
if (!ArrayUtils.contains(ignoreParameters,
parameterName))
{
String[] parameterValues = entry.getValue();
if (parameterValues != null)
{
for (String parameterValue : parameterValues)
{
parameter.append(parameterName + " = "
+ parameterValue + "\n");
}
}
}
}
}
Log log = new Log();
log.setOperation(operation);
log.setOperator(operator);
log.setContent(content);
log.setParameter(parameter.toString());
log.setIp(ip);
logService.save(log);
break;
}
}
}
}

在LogInterceptor中的postHandle方法中,日志存储的代码是写在if(antPathMatcher.match(logConfig.getUrlPattern(), path))中。但logConfig.getUrlPattern()的路径无法和得到的path路径匹配。调试后发现,path始终为“”。

所以重点看path。path的定义为String path = request.getServletPath();

在网上查找资料后觉得这样写有问题。

http://zhidao.baidu.com/link?url=eeQHgVchoECim2s5SZPKE-qasm0ylP5O4NOD7GUnLRZg9KP1aew1LkMX6dN7BxR0aFXxJYiaMQZqmmXqCuziu_

如上文所述,request.getServletPath()得到的是web.xml里面写的servlet路径。如果web.xml里面写的是/*这样的通配符的话,就显示“”了吧。

不管怎样将String path = request.getServletPath()改为

String path =request.getRequestURI(); 运行正常。

The referenced article:

http://www.aiuxian.com/article/p-252688.html

关于拦截器实现日志存储到db的代码调试的更多相关文章

  1. struts2-权限拦截器、日志拦截器、execAndWait(进度条)拦截器配置

    1.权限拦截器 package login; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.Serv ...

  2. Feign 请求拦截器和日志

    Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参 ...

  3. 使用spring拦截器实现日志管理

    使用HandlerInterceptor拦截器,可以拦截请求,实现通用的日志管理操作 一.添加拦截器类 在"src/main/java"代码文件夹的"org.xs.dem ...

  4. 从源代码分析modelDriven拦截器和params拦截器和拦截器prepare 和paramsPrepareParamsStack拦截器栈(让你的Struts2代码更简洁——如何培养框架设计能力

    源代码文件:Web App Libraries/struts2-core-2.3.15.3.jar/struts-default.xml 拦截器modelDriven: <interceptor ...

  5. Struts2学习笔记四:深入拦截器

    一:拦截器的工作原理 拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回res ...

  6. struts拦截器的使用

    拦截器的使用 转自http://blog.csdn.net/woshisap/article/details/7271854 1:拦截器(Interceptor) 拦截器是Struts2最强大的特性之 ...

  7. 大数据学习——flume拦截器

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

  8. Struts2默认拦截器栈及内建拦截器使用具体解释

    Struts2内建拦截器介绍:   alias (别名拦截器):同意參数在跨越多个请求时使用不同别名,该拦截器可将多个Action採用不同名字链接起来,然后用于处理同一信息.  autowiring  ...

  9. struts2 基础5 OGNL、标签、四大域、默认拦截器说明

    OGNL表达式 OGNL:对象导抗图语言 OGNL表达式是一个上下文的概念,上下文Map结构 OGNL表达式需要使用#标注命名空间.访问上下文(Context)中的对象需要使用#符号标注命名空间,如# ...

随机推荐

  1. Docker上运行dotnet core

    下载microsoft/dotnet镜像 运行命令: docker pull microsoft/dotnet 如果没有使用阿里镜像加速的,参照这篇先配置好再跑上面命令: http://www.cnb ...

  2. 特征工程 dataframe格式

    import os import copy import codecs import operator import re from math import log from pyspark.sql ...

  3. Action类中获取request等对象的方法

    struts2中的action类中,SevletActionContext可以获取

  4. Echarts data数据为空时,显示“-”

    { name:'2007', type:'bar', data:["","",""]} 解决办法: 写成data:["" ...

  5. Daily Scrum 12.11

    今日完成任务: 解决了类型同时存在于两个自动生成的DLL中导致编译不通过的问题:修复了主页标签显示的BUG:修复异常,网站可以在服务器端正常运行. 明日任务: 黎柱金 解决上传文档时建立文档和标签联系 ...

  6. mui学习笔记

    一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...

  7. html5 文件上传 带进度条

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. git以及git flow 的使用

    转载:http://selfcontroller.iteye.com/blog/996494 在这里主要讲一下我在项目中用到的关于gitflow的用法.   公司的项目中,专门有一台用来存放版本库的服 ...

  9. Android性能优化方法(九)

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就 ...

  10. poj3264 - Balanced Lineup(RMQ_ST)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 45243   Accepted: 21240 ...