Ⅰ Struts2框架中web.xml中<filter-class>应该引用哪个类
说反了吧?带ng的是被淘汰的,最新struts2.5.13包里只有不带ng的核心类
最新的核心类增加了log4j的依赖,优化和增加了一些
packageorg.apache.struts2.dispatcher.filter;
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
importorg.apache.struts2.RequestUtils;
importorg.apache.struts2.StrutsStatics;
importorg.apache.struts2.dispatcher.Dispatcher;
importorg.apache.struts2.dispatcher.mapper.ActionMapping;
importorg.apache.struts2.dispatcher.ExecuteOperations;
importorg.apache.struts2.dispatcher.InitOperations;
importorg.apache.struts2.dispatcher.PrepareOperations;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.util.List;
importjava.util.regex.Pattern;
/**
*ss.Thisfilterisbettertouse
*whenyoudon',suchasSitemesh.
*/
,Filter{
privatestaticfinalLoggerLOG=LogManager.getLogger(StrutsPrepareAndExecuteFilter.class);
Ⅱ mvc的filter有几类,分别是什么
(1) 直接实现Filter,这一类过滤器只有CompositeFilter;
(2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;
(3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、和。
Ⅲ 有过滤器的springmvc代码怎么用
不过实现的方式有以下几类:
(1) 直接实现Filter,这一类过滤器只有CompositeFilter;
(2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;
(3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、和。
过滤器放在容器结构的什么位置?
过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet、一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。Filter:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
Filter 有如下几个种类:
l 用户授权的Filter: Filter 负责检查用户请求,根据请求过滤用户非法请求。
l 日志Filter: 详细记录某些特殊的用户请求。
l 负责解码的Filter: 包括对非标准编码的请求解码。
l 能改变XML 内容的XSLTFilter 等。
Filter 有如下几个用处 :
l 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
l 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
l 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
l 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
创建一个 Filter 只需两个步骤
Ⅳ log4j和common-log的区别
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输出地;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。那么是不是这样,我们就可以完全使用log4j,而不需要扩展定制了呢?
1、基本介绍Log4j
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输出地;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
log4j的好处在于:
1) 通过修改配置文件,就可以决定log信息的目的地——控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
2) 通过修改配置文件,可以定义每一条日志信息的级别,从而控制是否输出。在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(......)等)。
3) 使用log4j,需要整个系统有一个统一的log机制,有利于系统的规划。
那么是不是这样,我们就可以完全使用log4j,而不需要扩展定制了呢?当然不是这样,因为每个项目的需求不一样,而且log4j本身也提供了灵活的扩展机制。下面我们说说log4j常用的扩展方式。
2、扩展点Log4j
2.1 自己的日志系统
每一个项目都想有自己的一套日志系统,而不受其他项目、jar包的影响。所以日志系统需要独立存在,且有相应的自己单独的配置文件而不受影响。我们先来看看common-logging和log4j的默认工作流程:
common-logging
当我们用Log log = LogFactory.getLog(“loggerName”);取得log时,让我们看看他是如何工作的?
1)、首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类
2)、如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类
3)、查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类
4)、使用JDK自身的日志实现类(JDK1.4以后才有日志实现类)
5)、使用commons-logging自己提供的一个简单的日志实现类SimpleLog
commons-logging总是能找到一个日志实现类,并且尽可能找到一个"最合适"的日志实现类.
.可以不需要配置文件
.自动判断有没有Log4j包,有则自动使用之
.最悲观的情况下也总能保证提供一个日志实现(SimpleLog)
log4j
当我们用Logger.getLogger(loggerName);取得log时,让我们看看他是如何工作的?
1)、查找是否已定义系统环境变量log4j.configuration,找到则使用其定义的Log配置文件;否则搜索log4j.xml,如果存在,则执行4)
2)、如果不存在,搜索log4j.properties
3)、如果不存在,则使用程序默认的日志仓库
4)、如果存在,注册配置日志仓库
5)、去日志仓库中查询,如果不存在,则new一个
从上面我们可以看到无论是common-logging还是log4j,以及其他的日志开源系统都会提供一套默认的遍历规则,去搜索他的log记录实例。一般情况下,我们都会使用它的默认规则,但是这样的话,我们就会受制于它,比如如果有人在默认规则中改变了某一个条件。
如果我们不想使用它的默认规则,该怎么办?很简单,在log4j中是通过日志仓库来维护一套独立日志系统,只要我们直接使用它的日志仓库,写一个我们自己的日志工厂就可以了。具体如下:
Public final class CustomLogFactory {
//日志仓库实例
Static LoggerRepository h = new Hierarchy(new RootLogger(Level.DEBUG));
Static {
//配置文件定制日志仓库属性,这里面你可以做更多的文章
//来定义自己的配置文件位置等等
new PropertyConfigurator().configure(h, urlConfigFile);
}
public static Logger getLogger(String loggerName) {
return h.getLogger(loggerName);
}
}
这样你的日志系统完全独立了。是不是很容易?
2.2 自己的日志记录器
Log4j的logger本身提供八种级别的日志记录,如果你想让你的logger没有级别概念,或者让日志信息支持国际化,那该怎么办?
Log4j用于第三方扩展的记录日志方法API
public boolean isEnabledFor(Priority level);
public void log(String callerFQCN, Priority level, Object message, Throwable t);扩展示例
1)、没有级别概念
Public final class CustomLogger {
//log4j日志记录器
Logger log4j;
//自己的FQCN
Private static final String FQCN = CustomLogger.class.getName();
//构造方法
Private CustomLogger(String loggerName) {
log4j = CustomLogFactory.getLogger(loggerName);
}
//工厂方法
Public static CustomLogger getLogger(String loggerName) {
Return new CustomLogger(loggerName);
}
Public Boolean isEntryEnabled() {
Return log4j. isEnabledFor(Level.INFO);
}
//程序入口日志
//你完全可以在message上做些手脚,加上一些自己的特殊的日志信息
//当然你也可以后面介绍的Appender的时候加
Public void entry(String message, Throwable t) {
Log4j.log(FQCN , Level.INFO, message, t);
}
Public Boolean isExitEnabled() {
Return log4j. isEnabledFor(Level.INFO);
}
//程序结束日志
Public void exit(String message, Throwable t) {
Log4j.log(FQCN , Level.INFO, message, t);
}
}
2)、支持国际化
主要是在message取得上做点事情。就像上面那个Public void entry(String message, Throwable t);如果你把API改为Public void entry(String messageID, Throwable t);实现改为:
Public void entry(String messageID, Throwable t) {
Log4j.log(FQCN , Level.INFO, getMessage(messageID), t);
}
//取得相应的国际化信息
Private String getMessage(String messageID) {
Return InternalResource.getLogMessage(messageID, Locale.getDefault());
}
2.3 自己的日志输出地
Log4j本身提供了大量的默认Appender实现,已经能很好的解决大部分应用,但是有时候我们还是有一些自己的需要,比如只有在输出到控制台Appender时加一个运行时才能确定的固定前缀。我们可以这么写:
public final class CustomConsoleAppender extends org.apache.log4j.ConsoleAppender {
@Override
protected void subAppend(LoggingEvent event) {
StringBuffer msgBuf = new StringBuffer();
//固定前缀
msgBuf.append('[');
msgBuf.append(Manager.current ().getName());
msgBuf.append(']');
//根据配置文件中的格式化信息格式化event
msgBuf.append(this.layout.format(event));
this.qw.write(msgBuf.toString());
……
}
} 也就是我们想定制某一种日志输出地,直接继承相应的log4j中的类似的Appender,然后复写相应的方法即可。最后在配置文件中使用自己定义的Appender类就行了。
2.4 自己的日志过滤器
Log4j的日志输出控制级别比较中有一个缺陷就是只能大于某个级别时才能输出,没有小于某个级别时才输出的控制,当然一般不会用到,如果有类似这样的需求是不是就做不到了呢?不是的,这时候你可以使用日志过滤器来实现。比如有这样一个需求,输出到控制台的日志信息,当级别小于WARN时,用 System.out;当大于等于WARN时,用System.err。
过滤器定义如下:
public final class CustomWarnLevelFilter extends org.apache.log4j.spi.Filter {
@Override
public int decide(LoggingEvent event) {
//大于等于WARN的日志不允许输出
if(event.getLevel().toInt() >= Level. WARN.toInt()) {
return DENY;
} else {
return ACCEPT;
}
}
}
配置文件中可以这样配置:
<appender class="com.primeton.ext.common.log.EOSConsoleAppender" name="CONSOLE_OUT">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%p][%C][Line:%L] %m%n"/>
</layout>
<filter class=" CustomWarnLevelFilter "/>
</appender>
<appender class="com.primeton.ext.common.log.EOSConsoleAppender" name="CONSOLE_ERR">
<param name="Target" value="System.err"/>
<param name="Threshold" value="WARN"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%p][%C][Line:%L] %m%n"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="CONSOLE_OUT"/>
<appender-ref ref="CONSOLE_ERR"/>
</root> 因为log4j设计的灵活性,所以当然也有其他的方式来达到这个目的。
上面简单介绍了对log4j常用的扩展方式,你还可以扩展像layout、errorhandler等等,这里不再赘述。
3、性能影响因素Log4j
Log4j一直被人所诟病的也就是它的性能问题了,所以在这里简要的说明一下使用log4j的注意事项:
1)、如果你的日志实例的名称不是经常变化,请将它定义为static变量。
2)、如果你的message构造很复杂,那么在构造之前,请先使用isXXXEnabled()判断。
3)、配置文件中格式控制如果不需要,尽量不要输出类名和行号。
4)、根据log4j的级别判断控制流程,在配置文件中尽可能配置的比较细致。
Logger.info(message)的比较流程:
a. 比较日志仓库的threashold
b. 与自身的有效Level(没有则是父亲的)比较
c. 与Appender的threashold比较
d. 询问Appender的filter
e. Layout格式化
f. 记录日志
5)、如果Appender是文件类型,请不要把文件大小设的太小。至少设为10MB(<param name="MaxFileSize" value="10MB"/>)。
6)、如果不是即时调试程序,把你的级别设定为高级别,最好是threshold=INFO之上。
7)、如果不是想即时看到日志信息,你也可以把Appender的ImmediateFlush 设为false(<param name="ImmediateFlush" value="false"/>)。
Ⅳ 如何配置log4j让他只显示我log.debug的内容
有log4j的配置文件吗?
如果是properties的,不要在声明rootlogger的时候,指定debug。像这样:log4j.rootLogger=info,stdout,error
如果是xml配置的话,在声明控制台输出的appender里面指定日志级别,这边我举例:
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p][%d{yyyy-MM-dd HH:mm:ss}][%l]:%m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="ERROR"/>
</filter>
</appender>
LOG4J的配置问题,你自己去研究下,这是学东西的机会,建议XML,可扩展性非常好
Ⅵ spring中怎么实现过滤器和监听器
1、延迟加载过滤器
Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。
Spring 为此专门提供了一个 OpenSessionInViewFilter 过滤器,它的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
2、乱码过滤器
对post乱码的处理,如下
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter①Spring编辑过滤器
</filter-class>
<init-param>②编码方式
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>③强制进行编码转换
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>②过滤器的匹配URL
<filter-name>encodingFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
3、请求跟踪日志过滤器
程度调试者可以详细地查看到有哪些请求被调用,请求的参数是什么,请求是否正确返回等信息,需要将log4j设为debug
org.springframework.web.filter.: 该过滤器将请求的 URI 记录到 Common 日志中
4、WebAppRootListener
可以将 Web 应用根目录添加到系统参数中,对应的属性名可以通过名为“webAppRootKey”的 Servlet 上下文参数指定,默认为“webapp.root”,配置如下
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>baobaotao.root</param-value>①Web应用根目录以该属性名添加到系统参数中
</context-param>
…
②负责将Web应用根目录以webAppRootKey上下文参数指定的属性名添加到系统参数中
<listener>
<listener-class>
org.springframework.web.util.WebAppRootListener
</listener-class>
</listener>
5、Log4jConfigListener监听器
包括了 WebAppRootListener 的功能,也就是说,Log4jConfigListener 会自动完成将 Web 应用根目录以 webAppRootKey 上下文参数指定的属性名添加到系统参数中,在log4j.xml可以直接使用
6、Introspector 缓存清除监听器
负责处理由 JavaBean Introspector 功能而引起的缓存泄露。IntrospectorCleanupListener 监听器在 Web 应用关闭的时会负责清除 JavaBean Introspector 的缓存,在 web.xml 中注册这个监听器可以保证在 Web 应用关闭的时候释放与其相关的 ClassLoader 的缓存和类引用。
Ⅶ logback里面可以写log4j的配置吗
Logback和log4j是非常相似的,如果你对log4j很熟悉,那对logback很快就会得心应手。下面列了logback相对于log4j的一些优点:
更快的实现
Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。
非常充分的测试
Logback经过了几年,数不清小时的测试。Logback的测试完全不同级别的。在作者的观点,这是简单重要的原因选择logback而不是log4j。
Logback-classic非常自然实现了SLF4j
Logback-classic实现了SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了SLF4J,所以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。
非常充分的文档
官方网站有两百多页的文档。
自动重新加载配置文件
当配置文件修改了,Logback-classic能自动重新加载配置文件。扫描过程快且安全,它并不需要另外创建一个扫描线程。这个技术充分保证了应用程序能跑得很欢在JEE环境里面。
Lilith
Lilith是log事件的观察者,和log4j的chainsaw类似。而lilith还能处理大数量的log数据
谨慎的模式和非常友好的恢复
在谨慎模式下,多个FileAppender实例跑在多个JVM下,能够安全地写道同一个日志文件。RollingFileAppender会有些限制。Logback的FileAppender和它的子类包括RollingFileAppender能够非常友好地从I/O异常中恢复。
配置文件可以处理不同的情况
开发人员经常需要判断不同的Logback配置文件在不同的环境下(开发,测试,生产)。而这些配置文件仅仅只有一些很小的不同,可以通过,和来实现,这样一个配置文件就可以适应多个环境。
Filters(过滤器)
有些时候,需要诊断一个问题,需要打出日志。在log4j,只有降低日志级别,不过这样会打出大量的日志,会影响应用性能。在Logback,你可以继续保持那个日志级别而除掉某种特殊情况,如alice这个用户登录,她的日志将打在DEBUG级别而其他用户可以继续打在WARN级别。要实现这个功能只需加4行XML配置。可以参考MDCFIlter
SiftingAppender(一个非常多功能的Appender)
它可以用来分割日志文件根据任何一个给定的运行参数。如,SiftingAppender能够区别日志事件跟进用户的Session,然后每个用户会有一个日志文件。
自动压缩已经打出来的log
RollingFileAppender在产生新文件的时候,会自动压缩已经打出来的日志文件。压缩是个异步过程,所以甚至对于大的日志文件,在压缩过程中应用不会受任何影响。
堆栈树带有包版本
Logback在打出堆栈树日志时,会带上包的数据。
自动去除旧的日志文件
通过设置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory属性,你可以控制已经产生日志文件的最大数量。如果设置maxHistory为12,那那些log文件超过12个月的都会被自动移除。
总之,logback比log4j太优秀了,让我们的应用全部建立logback上吧
Ⅷ druid的slf4jlogfilter与log4jfilter有什么区别
slf4j是hibernate的日志接口,通常我们用log4j.jar来实现hibernate的记录日志功能,slf4j-log4j.jar可以看成是用来把slf4j的接口转换成适合log4j的接口的一个适配器。
Ⅸ 在log4j中,怎样将一个filter设置进appender中去
一:使用log4j.xml
1.log4j.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<! log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j= akarta.ap ache.or g/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="/n[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l/n%m%n"/>
</layout>
</appender>
<appender name="DEBUG" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="./logs/app-debug.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss},%m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG"/>
<param name="LevelMax" value="DEBUG"/>
</filter>
</appender>