澳门永利备用网址使用过滤器创新应用程序,要求记录全数应用程序的伸手和各种请求的结果(状态码

运用过滤器立异应用程序

动用过滤器立异应用程序

壹 、过滤器的目标

① 、过滤器的目标

过滤器是可以阻碍访问能源的呼吁、财富的响应可能同时阻止两者的使用组件。过滤器可以检测和改动请求和响应,同时也可以拒绝、重定向或转向呼吁。javax.servlet.Filter接口落成了过滤器技术,使用HttpServletRequest和HttpServletResponse。过滤器能够在安顿描述符中以以编程的方式宣示,它们得以有初叶化参数并且可以访问ServletContext。

过滤器是足以阻挡访问能源的哀求、财富的响应或许同时阻止两者的运用组件。过滤器可以检测和修改请求和响应,同时也得以拒绝、重定向或转账呼吁。javax.servlet.Filter接口已毕了过滤器技术,使用HttpServletRequest和HttpServletResponse。过滤器能够在配置描述符中以以编程的办法宣示,它们能够有起始化参数并且可以访问ServletContext。

日记过滤器

日记过滤器

在应用程序开发中,须要记录全部应用程序的央浼和每一个请求的结果(状态码,长度等其他音讯)。经常Web容器提供了请求日志的建制,但一旦须求在呼吁日志中显得出一部分故意的新闻,可以采纳过滤记录请求。

在应用程序开发中,要求记录全数应用程序的伏乞和每种请求的结果(状态码,长度等其他消息)。日常Web容器提供了请求日志的机制,但一旦急需在伸手日志中体现出部分特有的新闻,可以应用过滤记录请求。

注明过滤器

证实过滤器

设若须求保障只有授权用户才得以访问应用程序,日常可以检查各种请求的新闻,保险用户已登录,过滤器可以因此将注明和授权操作集中到2个职位的主意使办事变得简单。

万一急需保险唯有授权用户才足以访问应用程序,平时可以检查各种请求的新闻,保险用户已报到,过滤器可以经过将表达和授权操作集中到一个岗位的办法使工作变得不难。

调减和加密过滤器

裁减和加密过滤器

存在着互连网带宽有限而CPU能源充沛的意况,平日在数码传输以前对数码进行压缩。过滤器可以在收取请求时,请求保持不变,但在响应再次来到给用户时,使用过滤器可以减小相应对象。

留存着互联网带宽有限而CPU财富充裕的景况,日常在数量传输在此以前对数据开展削减。过滤器可以在收受请求时,请求保持不变,但在响应再次回到给用户时,使用过滤器可以减掉相应对象。

错误处理过滤器

错误处理过滤器

对于Web用用程序而言,出现错误,是3个HTTP响应代码500,一般还会伴随着1个不足为奇的HTML页面,写着“Internal
Server
Error”以及一些确诊音信。对于在本土运营的应用程序对开发者是实用的,不过对于远程的应用程序来说是不要求的。需求经过过滤器给用户浮现出越发融洽的和通用的错误处理页面,并记录须求的错误消息。

对于Web用用程序而言,出现谬误,是三个HTTP响应代码500,一般还会陪伴着2个见怪不怪的HTML页面,写着“Internal
Server
Error”以及部分诊断音讯。对于在当地运维的应用程序对开发者是行得通的,不过对于远程的应用程序来说是不需求的。必要经过过滤器给用户显示出尤其协调的和通用的错误处理页面,并记下须求的错误音信。

贰 、创立、表明和照耀过滤器

② 、创造、表明和照耀过滤器

创设过滤器就是已毕Filter接口一样,过滤器在开首化的时候将调用init方法,他可以访问过滤器的陈设开端化参数和ServletContext。当呼吁进入到过滤器中,doFilter方法将会被调用,它提供了对ServletRequest、ServletResponse和FilterChain对象的访问。在doFilter中,能够拒绝请求或然调用FilterChain对象的doFilter方法,可以打包请求和响应对象。

创办过滤器就是落到实处Filter接口一样,过滤器在开首化的时候将调用init方法,他得以访问过滤器的布局开首化参数和ServletContext。当呼吁进入到过滤器中,doFilter方法将会被调用,它提供了对ServletRequest、ServletResponse和FilterChain对象的造访。在doFilter中,能够拒绝请求或然调用FilterChain对象的doFilter方法,可以打包请求和响应对象。

过滤器链

过滤器链

即便只有三个Servlet可以处理请求,可是足以运用过多的过滤拦截请求。在过滤器链中每1个过滤器接受进入的央求并将它传递到下三个过滤链中,直到全体匹配的过滤器都处理完了,最后再将它传播Servlet中。调用FilterChain.doFilter()将触及过滤器链的缕缕举办。假若当前的过滤器没有调用FilterChain.doFilter(),将把控制权重回值Servlet容器中。

即使唯有3个Servlet可以拍卖请求,可是可以利用过多的过滤拦截请求。在过滤器链中每二个过滤器接受进入的伏乞并将它传递到下2个过滤链中,直到全数匹配的过滤器都处理完了,最后再将它传播Servlet中。调用FilterChain.doFilter()将触发过滤器链的不断进行。要是当前的过滤器没有调用FilterChain.doFilter(),将把控制权重回值Servlet容器中。

映射到URL模式和Servlet名称

映射到URL模式和Servlet名称

同Servlet一样,过滤器能够被映射到U凯雷德L方式,那会操纵哪些或如何过滤器将阻碍有个别请求。任何匹配某些过滤器的U库罗德L方式的请求在被匹配的Servlet处理从前将第贰进入该过滤器,通过运用U卡宴L情势,不仅可以阻挡Servlet请求,还足以阻止任何财富。

同Servlet一样,过滤器可以被映射到U奥德赛L情势,那会操纵哪些或怎么样过滤器将阻止有个别请求。任何匹配有个别过滤器的U奥迪Q3L格局的乞请在被匹配的Servlet处理以前将率先进入该过滤器,通过选择USportageL形式,不仅可以阻止Servlet请求,还是能阻碍任何资源。

只是当以后早已有多少个UGL450L已经映射到Servlet上,并且期望有些过滤器映射到这一个U奥迪Q5L上。与映射到U哈弗L上反而,可以将那几个过滤器映射到一个或八个Servlet名称上。

不过当未来已经有两个UTiguanL已经映射到Servlet上,并且期望有个别过滤器映射到那一个U途乐L上。与映射到UENVISIONL上反而,可以将那一个过滤器映射到一个或七个Servlet名称上。

1.在布署描述符中使用<filter>和<filter-mapping>成分:

1.在安插描述符中使用<filter>和<filter-mapping>成分:

    <filter>
        <filter-name>filterA</filter-name>
        <filter-class>com.wrox.AnyRequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterA</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>filterA</filter-name>
        <filter-class>com.wrox.AnyRequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterA</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

在注脚了过滤器之后,可以将它映射到自由数目标U牧马人L或Servlet名称。当然过滤器U智跑L映射还是可以涵盖通配符。

在申明了过滤器之后,可以将它映射到任意数目标URubiconL或Servlet名称。当然过滤器U奇骏L映射还足以分包通配符。

2.应用申明注脚和照耀过滤器

2.选用表明注脚和照耀过滤器

@WebFilter{
    filterName = "myFilter",
    urlPatterns = {"/foo","/bar/*"},
    serVletNames = {"myServlet"},
    dispatcherTypes = {DispatcherType.REQUEST,         
    DispatcherType.ASYNC}    
}
@WebFilter{
    filterName = "myFilter",
    urlPatterns = {"/foo","/bar/*"},
    serVletNames = {"myServlet"},
    dispatcherTypes = {DispatcherType.REQUEST,         
    DispatcherType.ASYNC}    
}

不过不可以对对过滤器链上的过滤器进行排序

唯独不可以对对过滤器链上的过滤器举办排序

叁 、过滤器排序

叁 、过滤器排序

过滤器的逐一决定了过滤器在过滤器链中现身的地方,那里将会动用安插描述符来进行安排,因为注脚不可以展开排序配置。

过滤器的顺序决定了过滤器在过滤器链中出现的职分,那里将会采纳陈设描述符来进行安插,因为注明不可以进展排序配置。

U奥迪Q3L形式映射和Servlet名称映射,匹配请求的过滤器将依照它们出现在布置描述符或然编程式配置中的顺序添加到过滤器链中,但是急需留意UEscortL映射的过滤器优先级比Servlet名称映射到的过滤器高,由U福特ExplorerL方式匹配的过滤器总是出现在有Servlet名称匹配的过滤器以前。

U帕杰罗L方式映射和Servlet名称映射,匹配请求的过滤器将坚守它们出现在陈设描述符大概编程式配置中的顺序添加到过滤器链中,不过急需注意UKoleosL映射的过滤器优先级比Servlet名称映射到的过滤器高,由UPAJEROL形式匹配的过滤器总是出现在有Servlet名称匹配的过滤器从前。

    <filter>
        <filter-name>filterA</filter-name>
        <filter-class>com.wrox.FilterA</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>filterA</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>filterB</filter-name>
        <filter-class>com.wrox.FilterB</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>filterB</filter-name>
        <url-pattern>/servletTwo</url-pattern>
        <url-pattern>/servletThree</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>filterC</filter-name>
        <filter-class>com.wrox.FilterC</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>filterC</filter-name>
        <url-pattern>/servletTwo</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>filterA</filter-name>
        <filter-class>com.wrox.FilterA</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>filterA</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>filterB</filter-name>
        <filter-class>com.wrox.FilterB</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>filterB</filter-name>
        <url-pattern>/servletTwo</url-pattern>
        <url-pattern>/servletThree</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>filterC</filter-name>
        <filter-class>com.wrox.FilterC</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>filterC</filter-name>
        <url-pattern>/servletTwo</url-pattern>
    </filter-mapping>

那是二个filter的实例:

那是二个filter的实例:

那是处理中的第四个过滤器,它将记录处理请求的时刻,并记下全体访问应用程序的乞求消息——IP地址、时间戳、请求方法等新闻,finally块中是日记的操作。

那是拍卖中的首个过滤器,它将记录处理请求的岁月,并记录全体访问应用程序的请求音信——IP地址、时间戳、请求方法等新闻,finally块中是日记的操作。

public class RequestLogFilter implements Filter
{
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException
    {
        Instant time = Instant.now();
        StopWatch timer = new StopWatch();
        try
        {
            timer.start();
            chain.doFilter(request, response);
        }
        finally
        {
            timer.stop();
            HttpServletRequest in = (HttpServletRequest)request;
            HttpServletResponse out = (HttpServletResponse)response;
            String length = out.getHeader("Content-Length");
            if(length == null || length.length() == 0)
                length = "-";
            System.out.println(in.getRemoteAddr() + " - - [" + time + "]" +
                    " \"" + in.getMethod() + " " + in.getRequestURI() + " " +
                    in.getProtocol() + "\" " + out.getStatus() + " " + length +
                    " " + timer);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void destroy() { }
}
public class RequestLogFilter implements Filter
{
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException
    {
        Instant time = Instant.now();
        StopWatch timer = new StopWatch();
        try
        {
            timer.start();
            chain.doFilter(request, response);
        }
        finally
        {
            timer.stop();
            HttpServletRequest in = (HttpServletRequest)request;
            HttpServletResponse out = (HttpServletResponse)response;
            String length = out.getHeader("Content-Length");
            if(length == null || length.length() == 0)
                length = "-";
            System.out.println(in.getRemoteAddr() + " - - [" + time + "]" +
                    " \"" + in.getMethod() + " " + in.getRequestURI() + " " +
                    in.getProtocol() + "\" " + out.getStatus() + " " + length +
                    " " + timer);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void destroy() { }
}