「java日志文件过滤」java解析日志文件

博主:adminadmin 2022-11-27 18:58:07 1249

本篇文章给大家谈谈java日志文件过滤,以及java解析日志文件对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java日志的filter

Filter可以视作是servlet的加强版,主要用作对用户的请求进行预处理,或者对返回给客户端的结果进行再次加工,是一个典型的链式处理模式。本篇简单介绍filter的基本使用方法,主要涉及以下内容:

Filter的背景知识

使用Filter的流程

Filter的生命周期

一个完整的实例

一、Filter的简单介绍

Filter在英文中是过滤器的意思,当然在此处的使用也是完美的切合了它的意思,我们使用filter的主要目的就是完成一个过滤的作用。可以在一个请求到达servlet之前,将其截取进行逻辑判断,然后决定是否放行到请求的servlet。也可以在一个response到达客户端之前,截取结果进行逻辑判断,然后决定是否允许返回给客户端。所以filter有如下几个种类:

用户授权的filter:filter负责判断用户是否有权限请求该页面,给予过滤判断

日志filter:截取某个用户在本网站上的所有请求,记录轨迹

负责解码的filter:规定处理本次请求的解码方式

最后需要注意的是,一个filter过滤器可以加在多个servlet控制器上,当然多个filter过滤器也是可以加在一个servlet控制器上的。由此也是可以看出来,我们使用filter往往是对一些公共的操作进行处理,例如:判断用户权限,解码本次请求等,还比如,我们的web应用中某些页面是需要用户登录后才能访问的,以往我们都是在每个servlet页面加上判断控制,导致代码冗余,有了filter,我们可以定义一个实现了filter的过滤器,让需要判断是否登录的页面都加上这么一个过滤器,可以大大降低代码的冗余程度。

二、Filter的使用流程

在Java中如果想要自定义一个filter过滤器的话,需要继承Javax.servlet.Filter接口,这个接口中只有三个方法:

default void init(FilterConfig filterConfig)void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3)default void destroy()

其中init和destroy方法是有默认实现的,也就是我们不是必须重写这两个方法,但是doFilter 这个方法是一个核心的方法,是我们必须要实现的。首先我们看init方法的作用,这个方法是用来初始化filter实例的,也就是当用户请求了某个拦截器而此拦截器又匹配了某个过滤器,此时web容器就会定位到该过滤器然后创建该filter类的实例对象并调用此实例的init方法,完成初始化工作。对于destroy方法毋庸置疑就是在过滤器执行结束的时候调用,主要完成对一些资源的释放。下面主要看dofilter这个方法。

doFilter方法是filter接口中的核心方法,一旦创建完该过滤器的实例之后,会执行dofilter方法,所有的过滤逻辑都是在此方法中进行的。主要有三个参数,第一个参数是一个ServletRequest对象,HttpServletRequest继承于此接口,当用户请求某个拦截器的时候,检测到此请求存在过滤器,于是会封装好本次请求的相关数据,传递给dofilter的ServletRequest参数,ServletResponse参数的来源和ServletRequest是一样的,都是由客户端封装过来的。至于第三个参数,这是一个FilterChain处理链,详细的介绍等说明了web.xml中配置filter之后。

第一步如上,创建一个继承自filter接口的类,并实现其中的三个方法。第二步是在web.xml中配置该类用于过滤哪些拦截器。web.xml代码如下:

?xml version="1.0" encoding="UTF-8"?web-app xmlns=""

        xmlns:xsi=""

        xsi:schemaLocation=" "

        version="3.1"

   !--定义filter--

   filter

       filter-nameisLogin/filter-name

       filter-classTest_f.MyFilter/filter-class

   /filter

   !--定义filter拦截的地址--

   filter-mapping

       filter-nameisLogin/filter-name

       url-pattern/a/url-pattern

   /filter-mapping

   filter-mapping

       filter-nameisLogin/filter-name

       url-pattern/b/url-pattern

   /filter-mapping/web-app

如上述的代码,我们需要两个操作,首先是定义一个filter,指定了该filter的name和相对应的过滤器类。然后我们可以通过filter-mapping映射过滤器和URL,此处使用了两个映射,对该过滤器指定了对路径名为/a和/b的请求进行拦截。当然这个url-pattern元素的值可以有以下三种形式,完全匹配(/a/b等),目录匹配(/* 、 /abc/等),扩展名(.a,*.b等)。

了解了配置filter的主要操作之后,我们回去看过滤器类,我们说init方法是在首次创建filter实例的时候,用于执行初始化操作的,其中有个参数FilterConfig ,这是当前filter的配置信息,其中方法如下:

String getFilterName();ServletContext getServletContext();String getInitParameter(String var1);EnumerationString getInitParameterNames();

其实在创建filter实例的时候,web容器会将此实例对应在web.xml中的配置信息读取并封装成一个FilterConfig 对象传递给init方法,getFilterName方法就是我们在web.xml中配置的filter-name,getServletContext会获取当前servlet的上下文,当我们在定义filter的时候使用init-param来定义一些初始化参数的时候,就可以使用此方法来获取这些初始化参数。getInitParameterNames方法用于获取所有初始化参数的枚举集合。这样我们在init方法中就可以获取这些配置参数,初始化filter实例。

上面我们只定义了一个filter,如果我们对于一次请求需要执行多个filter,进行过滤操作的话,web容器会在你请求某个URL的时候,在web.xml中找到所有匹配的filter,按照注册的顺序以FilterChain 链的形式传递到方法doFilter的第三个参数中,而这个filterChain中只有一个方法:

void doFilter(ServletRequest var1, ServletResponse var2)

如果我们在 void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) 方法中调用var3.doFilter(var1,var2),就代表此filter实例结束,则web服务器会检查FilterChain对象中是否还有filter对象(因为这是一个链,filter的数量是大于等于一的),如果没有就会放行,直接调用目标地址,如果还有filter对象,就会转而执行下一个filter。正是由于这样的机制,我们才可以对于一个URL请求添加多个filter过滤器。

三、一个简单的实例

下面通过一个简单的实例直观的感受下filter过滤器的作用:

public class MyFilter implements Filter {    @Override

   public void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException{

       HttpServletRequest req = (HttpServletRequest)var1;

       HttpSession session = req.getSession();

       String state = (String)session.getAttribute("state");        if(state.equals("1")){

           var3.doFilter(var1,var2);

       }else{

           HttpServletResponse response =  (HttpServletResponse)var2;

           response.sendRedirect("Error_page.html");

       }

   }

}

//web.xml    filter

       filter-nameisLogin/filter-name

       filter-classTest_f.MyFilter/filter-class

   /filter

   !--定义filter拦截的地址--

   filter-mapping

       filter-nameisLogin/filter-name

       url-pattern/index.jsp/url-pattern

   /filter-mapping

%@ page contentType="text/html;charset=UTF-8" language="java" %html

 head

   title/title

 /head

 body

   h1这是index页面/h1

 /body/html

//set.jsp//为了使程序简单,我们采用手动设置session//在实际的项目中,当用户登录之后自动设置session%@ page contentType="text/html;charset=UTF-8" language="java" %html

 head

   title/title

 /head

 body

   %pageContext.getSession().setAttribute("state","0");%

 /body/html

我们首先访问set.jsp页面设置本次会话的session值,然后修改浏览器地址栏访问index.jsp页面

敲下回车键,结果如下:

我们先看,敲下回车键之后,程序怎么执行的,因为我们在web.xml中配置了MyFilter的拦截URL为index.jsp,所以当我们访问index.jsp的时候,会创建MyFilter 实例对象,封装配置信息到FilterConfig对象中,然后封装request请求和response,还有从web.xml 中读取的FilterChain对象传入MyFilter的doFilter方法中,我们在其中获取本次会话的session对象,取得其中的数据,如果为一放行,否则跳转到错误页面。此处的state的session值为0,我们在set.jsp中设置的,大家也可以在set.jsp页面设置其值为1,这样最终的结果会是这样的:

上述的demo只是为了简单的演示,其实使用filter可以完成大大的降低我们的代码的冗余程度。这个例子是为了演示,所以很简单。

四、Filter 的生命周期

当用户请求某个页面时候,会到web.xml中匹配是否存在能够匹配上此次请求的filter,如果有封装它的配置信息,FilterChain链。然后调用init方法,完成初始化,接着调用dofilter方法,处理核心逻辑,当此实例被销毁的时候,会调用destroy方法。

java项目和web项目中的过滤器文件怎么使用?

过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:

1. 以常规的方式调用资源(即,调用servlet或JSP页面)。

2.利用修改过的请求信息调用资源。

3. 调用资源,但在发送响应到客户机前对其进行修改

4. 阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。

1. 建立基本过滤器

建立一个过滤器涉及下列五个步骤:

1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。

doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。

2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。

3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。

4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。

5)禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。

1.1 建立一个实现Filter接口的类

所有过滤器都必须实现javax.servlet.Filter。这个接口包含三个方法,分别为doFilter、init和destroy。

public void doFilter(ServletRequset request,

ServletResponse response,

FilterChain chain)

thows ServletException, IOException

每当调用一个过滤器(即,每次请求与此过滤器相关的servlet或JSP页面)时,就执行其doFilter方法。正是这个方法包含了大部分过滤逻辑。第一个参数为与传入请求有关的ServletRequest。对于简单的过滤器,大多数过滤逻辑是基于这个对象的。如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,就要把此对象构造成HttpServletRequest。

第二个参数为ServletResponse。除了在两个情形下要使用它以外,通常忽略这个参数。首先,如果希望完全阻塞对相关servlet或JSP页面的访问。可调用response.getWriter并直接发送一个响应到客户机。其次,如果希望修改相关的servlet或JSP页面的输出,可把响应包含在一个收集所有发送到它的输出的对象中。然后,在调用serlvet或JSP页面后,过滤器可检查输出,如果合适就修改它,之后发送到客户机。

DoFilter的最后一个参数为FilterChain对象。对此对象调用doFilter以激活与servlet或JSP页面相关的下一个过滤器。如果没有另一个相关的过滤器,则对doFilter的调用激活servlet或JSP本身。

public void init(FilterConfig config) thows ServletException

init方法只在此过滤器第一次初始化时执行,不是每次调用过滤器都执行它。对于简单的过滤器,可提供此方法的一个空体,但有两个原因需要使用init。首先,FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。因此,普遍的办法是利用init将FilterConfig对象存放在一个字段中,以便doFilter方法能够访问servlet环境或过滤器名.其次,FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参数。

public void destroy( )

大多数过滤器简单地为此方法提供一个空体,不过,可利用它来完成诸如关闭过滤器使用的文件或数据库连接池等清除任务。

1.2 将过滤行为放入doFilter方法

doFilter方法为大多数过滤器地关键部分。每当调用一个过滤器时,都要执行doFilter。对于大多数过滤器来说,doFilter执行的步骤是基于传入的信息的。因此,可能要利用作为doFilter的第一个参数提供的ServletRequest。这个对象常常构造为HttpServletRequest类型,以提供对该类的更特殊方法的访问。

1.3 调用FilterChain对象的doFilter方法

Filter接口的doFilter方法以一个FilterChain对象作为它的第三个参数。在调用该对象的doFilter方法时,激活下一个相关的过滤器。这个过程一般持续到链中最后一个过滤器为止。在最后一个过滤器调用其FilterChain对象的doFilter方法时,激活servlet或页面自身。

但是,链中的任意过滤器都可以通过不调用其FilterChain的doFilter方法中断这个过程。在这样的情况下,不再调用JSP页面的serlvet,并且中断此调用过程的过滤器负责将输出提供给客户机。

1.4 对适当的servlet和JSP页面注册过滤器

部署描述符文件的2.3版本引入了两个用于过滤器的元素,分别是:filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。

下面是一个完整的例子:

//建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。

//doFilter方法包含主要的过滤代码,init方法建立设置操作,而destroy方法进行清

package filterpkg;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

public class testFilter implements Filter{

public void init(FilterConfig filterConfig) throws ServletException

{

}

//在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。

//此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。

//第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。

//最后一个参数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain filterChain)

{

PrintWriter wout=null;

try

{

wout=response.getWriter();

}

catch(IOException e)

{

}

HttpServletRequest req=(HttpServletRequest)request;//将request转化为它的子类HttpServletRequest

String uri=req.getRequestURI();//获得传入的URI

if (uri.indexOf("MyJsp.jsp")0 ||uri.indexOf("MainForm.do")0 )//如果是我们指定的登录页面或验证页面

{

try

{

//调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。

//在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。

filterChain.doFilter(request, response);

}

catch(Exception e)

{

}

return;

}

if (req.getSession()!=null)

if (req.getSession().getAttribute("USERID")==null)

{

wout.write("HTMLBODY Check error! br/ /BODY /HTML");

wout.flush();

return;

}

try

{

filterChain.doFilter(request, response);

}

catch(Exception e)

{

}

}

public void destroy()

{

}

}

web.xml

?xml version="1.0" encoding="UTF-8"?

web-app version="2.4"

xmlns=""

xmlns:xsi=""

xsi:schemaLocation="

"

filter

filter-nameCHECKCODE/filter-name

filter-classfilterpkg.testFilter/filter-class

/filter

filter-mapping

filter-nameCHECKCODE/filter-name

url-pattern/*/url-pattern

/filter-mapping

servlet

descriptionThis is the description of my J2EE component/description

display-nameThis is the display name of my J2EE component/display-name

servlet-nameControlServlet/servlet-name

servlet-classfilterpkg.ControlServlet/servlet-class

/servlet

servlet-mapping

servlet-nameControlServlet/servlet-name

url-pattern*.do/url-pattern

/servlet-mapping

/web-app

什么是java过滤器! 它的功能和作用是什么啊?

Filter 技术是servlet 2.3 新增加的功能.servlet2.3是sun公司与2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.由于众多的参与者的共同努力,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高.

它新增加的功能包括:

1. 应用程序生命周期事件控制;

2. 新的国际化;

3. 澄清了类的装载规则;

4. 新的错误及安全属性;

5. 不赞成使用HttpUtils 类;

6. 各种有用的方法;

7. 阐明并扩展了几个servlet DTD;

8. filter功能.

其中最重要的就是filter功能.它使用户可以改变一个request和修改一个 response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).一个filter 包括:

1. 在servlet被调用之前截获;

2. 在servlet被调用之前检查servlet request;

3. 根据需要修改request头和request数据;

4. 根据需要修改response头和response数据;

5. 在servlet被调用之后截获.

你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.几个实用的filter 包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等.

一个filter必须实现javax.servlet.Filter接口并定义三个方法:

1.void setFilterConfig(FilterConfig config) //设置filter 的配置对象;

2. FilterConfig getFilterConfig() //返回filter的配置对象;

3. void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) //执行filter 的工作.

服务器每次只调用setFilterConfig方法一次准备filter 的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置 FilterConfig为空来指明filter已经终结.

每一个filter从doFilter()方法中得到当前的request及 response.在这个方法里,可以进行任何的针对request及response的操作.(包括收集数据,包装数据等).filter调用 chain.doFilter()方法把控制权交给下一个filter.一个filter在doFilter()方法中结束.如果一个filter想停止 request处理而获得对response的完全的控制,那它可以不调用下一个filter.

一个filter可以包装request 或response以改变几个方法和提供用户定制的属性.Api2.3提供了HttpServletRequestWrapper 和HttpServletResponseWrapper来实现.它们能分派最初的request和response.如果要改变一个方法的特性,必须继承wapper和重写方法.下面是一段简单的日志filter用来记录所有request的持续时间.

public class LogFilter implements Filter {

FilterConfig config;

public void setFilterConfig(FilterConfig config) {

this.config = config;

}

public FilterConfig getFilterConfig() {

return config;

}

public void doFilter(ServletRequest req,

ServletResponse res,

FilterChain chain) {

ServletContext context = getFilterConfig().getServletContext();

long bef = System.currentTimeMillis();

chain.doFilter(req, res); // no chain parameter needed here

long aft = System.currentTimeMillis();

context.log("Request to " + req.getRequestURI()

+ ": " + (aft-bef));

}

}

当server调用setFilterConfig(),filter保存config信息. 在doFilter()方法中通过config信息得到servletContext.如果要运行这个filter,必须去配置到web.xml中.以 tomcat4.01为例:

filter

filter-name

log //filter 名字

/filter-name

filter-class

LogFilter //filter class(上例的servlet)

/filter-class

/filter

filter-mapping

filter-namelog/filter-name

servletnameservletname/servlet-name

/filter-mapping

servlet

servlet-nameservletname/servletname

servletclassservletclass/servlet-class

/servlet

servlet-mapping

servlet-nameservletname/servlet-name

url-pattern*/url-pattern

/servlet-mapping

把这个web.xml放到web-inf中(详请参考tomcat帮助文档).

当每次请求一个request时(如index.jsp),先到LogFilter中去并调用doFilter()方法,然后才到各自的servlet中去.如果是一个简单的servlet(只是一个页面,无任何输出语句),那么可能的输出是:

Request to /index.jsp: 10

Filter是一个COM组件,由一个或多个Pin组成。Pin也是一个COM组件。 Filter文件的扩展名为.ax,但也可以是.dll。Filter根据其包含Input pin或Output pin的情况(或在Filter Graph的位置),大致可分为三类:Source Filter(仅有Output pin)、Transform Filter(同时具有Input pin和Output pin)和Renderer Filter(仅有Input pin)。

一般情况下,创建Filter使用一个普通的Win32 DLL项目。而且,一般Filter项目不使用MFC。这时,应用程序通过CoCreateInstance函数Filter实例;Filter与应用程序在二进制级别的协作。另外一种方法,也可以在MFC的应用程序项目中创建Filter。这种情况下,Filter不需注册为COM组件,Filter与应用程序之间的协作是源代码级别的;创建Filter实例,不再使用CoCreateInstance函数,而是直接new出一个Filter对象,如下:

m_pFilterObject = new CFilterClass();

// make the initial refcount 1 to match COM creation

m_pFilterObject -AddRef();

因为Filter的基类实现了对象的引用计数,所以即使在第二种情况下,对创建后的Filter对象的操作也完全可以遵循COM标准。

Filter是一个独立功能模块,最好不要将Filter依赖于其他第三方的DLL。因为 Filter具有COM的位置透明性特点,Filter文件可以放在硬盘的任何位置,只要位置移动后重新注册。但此时,如果Filter依赖其他DLL,则Filter对该DLL的定位就会出现问题。

Filter不能脱离Filter Graph单独使用。所以,如果你想绕过Filter Graph直接使用Filter实现的模块功能,请将你的Filter移植成DMO(DirectX Media Object)。对于DirectShow应用程序开发者来说,还有一点,请不要忘记使用OleInitialize进行初始化。

2. Filter的注册

Filter是COM组件,所以在使用前一定要注册。Filter的注册程序为 regsvr32.exe。如果带上命令行参数/u,表示注销;如果带上是/s,表示不弹出任何注册/注销成功与否的提示对话框。如果你想在Build Filter项目的时候进行自动注册,请在VC的Project settings的Custom Build页如下设置:

Description: Register filter

Commands: regsvr32 /s /c $(TargetPath)

echo regsvr32 exe.time $(TargetDir)\$(TargetName).trg

Outputs: $(TargetDir)\$(TargetName).trg

Filter的注册信息包括两部分:基本的COM信息和Filter信息。注册信息都存放在注册表中。前者的位置为:HKEY_CLASSES_ROOT\CLSID\Filter Clsid\,后者的位置为:HKEY_CLASSES_ROOT\CLSID\Category\Instance\ Filter Clsid\。COM信息标示了Filter是一个标准的可以通过CoCreateInstance函数创建的COM组件,Filter信息标示了我们通过Graphedit看到的描述这个Filter的信息。如果你不想让Graphedit看到(或者让Filter枚举器找到)你写的Filter,你完全可以不注册Filter信息。而且不用担心,你这么做也完全不会影响Filter的功能。

屏蔽注册Filter信息的方法也很简单。因为CBaseFilter实现了IAMovieSetup接口的两个函数:Register和Unregister。我们只需重载这两个函数,直接return S_OK就行了。

Filter的Merit值。这个值是微软的“智能连接”函数使用的。在Graphedit中,当我们加入一个Source Filter后,在它的pin上执行“Render”,会自动连上一些Filter。Merit的值参考如下:

MERIT_PREFERRED = 0x800000,

MERIT_NORMAL = 0x600000,

MERIT_UNLIKELY = 0x400000,

MERIT_DO_NOT_USE = 0x200000,

MERIT_SW_COMPRESSOR = 0x100000,

MERIT_HW_COMPRESSOR = 0x100050

Merit值只有大于MERIT_DO_NOT_USE的时候才有可能被“智能连接”使用;Merit的值越大,这个Filter的机会就越大。

3. Filter之间Pin的连接过程

Filter只有加入到Filter Graph中并且和其它Filter连接成完整的链路后,才会发挥作用。Filter之间的连接(也就是Pin之间的连接),实际上是连接双方的一个 Media type的协商过程。连接的方向总是从Output pin指向Input pin。连接的大致过程为:如果调用连接函数时已经指定了完整的Media type,则用这个Media type进行连接,成功与否都结束连接过程;如果没有指定或不完全指定了Media type,则进入下面的枚举过程。枚举欲连接的Input pin上所有的Media type,逐一用这些Media type与Output pin进行连接(如果连接函数提供了不完全Media type,则要先将每个枚举出来的Media type与它进行匹配检查),如果Output pin也接受这种Media type,则Pin之间的连接宣告成功;如果所有Input pin上枚举的Media type,Output pin都不支持,则枚举Output pin上的所有Media type,并逐一用这些Media type与Input pin进行连接。如果Input pin接受其中的一种Media type,则Pin之间的连接到此也宣告成功;如果Output pin上的所有Media type,Input pin都不支持,则这两个Pin之间的连接过程宣告失败。

每个Pin都可以实现GetMediaType函数来提供该Pin上支持的所有 Preferred Media type(但一般只在Output pin上实现,Input pin主要实现CheckMediaType看是否支持当前提供的Media type就行了)。连接过程中,Pin上枚举得到的所有Media type就是这里提供的。

在CBasePin类中有一个protected的成员变量 m_bTryMyTypesFirst,默认值为false。在我们定制Filter的Output pin中改变这个变量的值为true,可以定制我们自己的连接过程(先枚举Output pin上的Media type)。

当Pin之间的连接成功后,各自的pin上都会调用CompleteConnect函数。我们可以在这里取得一些连接上的Media type的信息,以及进行一些计算等。在Output pin的CompleteConnect实现中,还有一个重要的任务,就是协商Filter Graph运行起来后Sample传输使用的内存配置情况。这同样是一个交互过程:首先要询问一下Input pin上的配置要求,如果Input pin提供内存管理器(Allocator),则优先使用Input pin上的内存管理器;否则,使用Output pin自己生成的内存管理器。我们一般都要实现DecideBufferSize来决定存放Sample的内存大小。注意:这个过程协商完成之后,实际的内存并没有分配,而要等到Output pin上的Active函数调用。

4. Filter Media type概述

Media type一般可以有两种表示:AM_MEDIA_TYPE和CMediaType。前者是一个Struct,后者是从这个Struct继承过来的类。

每个Media type有三部分组成:Major type、Subtype和Format type。这三个部分都使用GUID来唯一标示。Major type主要定性描述一种Media type,比如指定这是一个Video,或Audio或Stream等;Subtype进一步细化Media type,如果Video的话可以进一步指定是UYVY或YUY2或RGB24或RGB32等;Format type用一个Struct更进一步细化Media type。

如果Media type的三个部分都是指定了某个具体的GUID值,则称这个Media type是完全指定的;如果Media type的三个部分中有任何一个值是GUID_NULL,则称这个Media type 是不完全指定的。GUID_NULL具有通配符的作用。

常用的Major type:

MEDIATYPE_Video;

MEDIATYPE_Audio;

MEDIATYPE_AnalogVideo; // Analog capture

MEDIATYPE_AnalogAudio;

MEDIATYPE_Text;

MEDIATYPE_Midi;

MEDIATYPE_Stream;

MEDIATYPE_Interleaved; // DV camcorder

MEDIATYPE_MPEG1SystemStream;

MEDIATYPE_MPEG2_PACK;

MEDIATYPE_MPEG2_PES;

MEDIATYPE_DVD_ENCRYPTED_PACK;

MEDIATYPE_DVD_NAVIGATION;

常用的Subtype:

MEDIASUBTYPE_YUY2;

MEDIASUBTYPE_YVYU;

MEDIASUBTYPE_YUYV;

MEDIASUBTYPE_UYVY;

MEDIASUBTYPE_YVU9;

MEDIASUBTYPE_Y411;

MEDIASUBTYPE_RGB4;

MEDIASUBTYPE_RGB8;

MEDIASUBTYPE_RGB565;

MEDIASUBTYPE_RGB555;

MEDIASUBTYPE_RGB24;

MEDIASUBTYPE_RGB32;

MEDIASUBTYPE_ARGB32; // Contains alpha value

MEDIASUBTYPE_Overlay;

MEDIASUBTYPE_MPEG1Packet;

MEDIASUBTYPE_MPEG1Payload; // Video payload

MEDIASUBTYPE_MPEG1AudioPayload; // Audio payload

MEDIASUBTYPE_MPEG1System; // A/V payload

MEDIASUBTYPE_MPEG1VideoCD;

MEDIASUBTYPE_MPEG1Video;

MEDIASUBTYPE_MPEG1Audio;

MEDIASUBTYPE_Avi;

MEDIASUBTYPE_Asf;

MEDIASUBTYPE_QTMovie;

MEDIASUBTYPE_PCM;

MEDIASUBTYPE_WAVE;

MEDIASUBTYPE_dvsd; // DV

MEDIASUBTYPE_dvhd;

MEDIASUBTYPE_dvsl;

MEDIASUBTYPE_MPEG2_VIDEO;

MEDIASUBTYPE_MPEG2_PROGRAM;

MEDIASUBTYPE_MPEG2_TRANSPORT;

MEDIASUBTYPE_MPEG2_AUDIO;

MEDIASUBTYPE_DOLBY_AC3;

MEDIASUBTYPE_DVD_SUBPICTURE;

MEDIASUBTYPE_DVD_LPCM_AUDIO;

MEDIASUBTYPE_DVD_NAVIGATION_PCI;

MEDIASUBTYPE_DVD_NAVIGATION_DSI;

MEDIASUBTYPE_DVD_NAVIGATION_PROVIDER;

常用的Format type:

FORMAT_None

FORMAT_DvInfo DVINFO

FORMAT_MPEGVideo MPEG1VIDEOINFO

FORMAT_MPEG2Video MPEG2VIDEOINFO

FORMAT_VideoInfo VIDEOINFOHEADER

FORMAT_VideoInfo2 VIDEOINFOHEADER2

FORMAT_WaveFormatEx WAVEFORMATEX

5. Filter之间的数据传送

Filter之间的数据是通过Sample来传送的。Sample是一个COM组件,拥有自己的一段数据缓冲。Sample由Allocator统一管理。如下图所示:

Filter之间数据传送的方式有两种:Push模式和Pull模式。

java 中的过滤器filter 都有什么作用

过滤器顾名思义就是进行过滤的,可以实现代码的定向执行和预处理。

通俗点说法filter相当于加油站,request是条路,response是条路,目的地是servlet,这个加油站设在什么地方对什么数据操作可以由你来控制。

备注:过滤器可以再请求和响应之前做一部分预处理,有效的过滤掉不需要的内容,而且过滤器可以被复用,节省了大量的复用代码,提高了java的代码执行效率

关于java日志文件过滤和java解析日志文件的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-27,除非注明,否则均为首码项目网原创文章,转载请注明出处。