澳门1495娱乐Java Web高级编程(三)Java Web高级编程(三)

使过滤器改进应用程序

使过滤器改进应用程序

相同、过滤器的目的

同、过滤器的目的

过滤器是得阻碍访问资源的呼吁、资源的响应或者又阻止两者的施用组件。过滤器可以检测及改要和响应,同时为可以拒绝、重定向或转账呼吁。javax.servlet.Filter接口实现了过滤器技术,使用HttpServletRequest和HttpServletResponse。过滤器可以于配置描述符中因因为编程的计宣示,它们得以起初始化参数并且可看ServletContext。

过滤器是可以阻挡访问资源的请求、资源的响应或者又拦两者的采用组件。过滤器可以检测和修改要和应,同时也得以拒绝、重定向或转发呼吁。javax.servlet.Filter接口实现了过滤器技术,使用HttpServletRequest和HttpServletResponse。过滤器可以当配备描述符中为因为编程的法宣示,它们可发初始化参数并且可以拜ServletContext。

日志过滤器

日记过滤器

当应用程序开发被,需要记录有应用程序的求与每个请求的结果(状态码,长度等其他信息)。通常Web容器提供了请日志的机制,但如欲在伸手日志被展示出片有意识的信息,可以下过滤记录请求。

当应用程序开发中,需要记录有应用程序的要和每个请求的结果(状态码,长度等另外信息)。通常Web容器提供了请求日志的体制,但若是要以呼吁日志被展示有部分蓄意的音信,可以用过滤记录请求。

征过滤器

征过滤器

若是要保证只有授权用户才方可看应用程序,通常可以检查每个请求的音信,保证用户都登录,过滤器可以由此以证明和授权操作集中到一个位置的章程如办事换得简单。

而急需保证只有授权用户才方可看应用程序,通常可以检查每个请求的消息,保证用户就登录,过滤器可以经将说明和授权操作集中到一个岗位的方式使办事转移得简单。

抽和加密过滤器

减掉和加密过滤器

存在网络带来富有限而CPU资源充足的气象,通常在数量传之前对数码进行削减。过滤器可以以吸收请求时,请求保持不转换,但每当应返回给用户时时,使用过滤器可以减少相应对象。

存在正在网络带来富有限而CPU资源充分的景,通常在数码传之前对数据开展削减。过滤器可以在吸纳请求时,请求保持无转移,但当应返回给用户时时,使用过滤器可以减去相应对象。

错误处理过滤器

错误处理过滤器

对此Web用用程序而言,出现错误,是一个HTTP响应代码500,一般还会见陪在一个一般性的HTML页面,写在“Internal
Server
Error”以及部分确诊信息。对于当地方运行的应用程序对开发者是行得通之,但是于远程的应用程序来说是免必要的。需要经过过滤器给用户展示出越来越友好的与通用的错误处理页面,并记下必要之错误信息。

对Web用用程序而言,出现错误,是一个HTTP响应代码500,一般还见面陪伴在一个平凡的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可以处理要,但是可以以过多底过滤拦截请求。在过滤器链中各一个过滤器接受上的要并将它们传递及下一个过滤链中,直到有匹配的过滤器都处理得,最终重用她传到Servlet中。调用FilterChain.doFilter()将触发过滤器链的连实行。如果手上的过滤器没有调用FilterChain.doFilter(),将将控制权返回值Servlet容器中。

尽管特出一个Servlet可以处理要,但是可下群之过滤拦截请求。在过滤器链中每一个过滤器接受上的伸手并以它传递至下一个过滤链中,直到所有匹配的过滤器都处理完,最终还以它们传到Servlet中。调用FilterChain.doFilter()将触及过滤器链的无休止推行。如果手上底过滤器没有调用FilterChain.doFilter(),将把控制权返回值Servlet容器被。

映射到URL模式和Servlet名称

映射到URL模式和Servlet名称

暨Servlet一样,过滤器可以于射到URL模式,这会操纵谁要如何过滤器将堵住某个请求。任何匹配有过滤器的URL模式之乞求在让匹配的Servlet处理之前以首先登该过滤器,通过动URL模式,不仅可以阻止Servlet请求,还好阻碍任何资源。

同Servlet一样,过滤器可以让射到URL模式,这会控制谁要什么过滤器将截留某个请求。任何匹配有过滤器的URL模式的伸手在受匹配的Servlet处理之前用第一进入该过滤器,通过以URL模式,不仅可阻挡Servlet请求,还可阻止任何资源。

但是当现在既来差不多个URL已经照到Servlet上,并且愿意某些过滤器映射到这些URL上。与照到URL上反而,可以拿这些过滤器映射到一个或多个Servlet名称上。

但当现在已起多个URL已经照到Servlet上,并且期望某些过滤器映射到这些URL上。与照到URL上反,可以拿这些过滤器映射到一个要么多个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>

在声明了过滤器之后,可以拿其映射到自由数目的URL或Servlet名称。当然过滤器URL映射还好分包通配符。

在宣称了过滤器之后,可以拿它们映射到自由数目的URL或Servlet名称。当然过滤器URL映射还得涵盖通配符。

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}    
}

但不可以针对针对过滤器链上之过滤器进行排序

而是未可以本着针对性过滤器链上之过滤器进行排序

其三、过滤器排序

老三、过滤器排序

过滤器的各个决定了过滤器在过滤器链中出现的岗位,这里将见面用安排描述符来进行布置,因为注解无法进展排序配置。

过滤器的相继决定了过滤器在过滤器链中出现的岗位,这里以见面采取安排描述符来进行布局,因为注解无法开展排序配置。

URL模式映射和Servlet名称映射,匹配请求的过滤器将照它出现于布局描述符或者编程式配置中之逐一上加到过滤器链中,但是用留意URL映射的过滤器优先级比Servlet名称映射到的过滤器高,由URL模式匹配的过滤器总是出现于发Servlet名称匹配的过滤器之前。

URL模式映射和Servlet名称映射,匹配请求的过滤器将依照其出现于安排描述符或者编程式配置中的各个上加到过滤器链中,但是用专注URL映射的过滤器优先级比Servlet名称映射到的过滤器高,由URL模式匹配的过滤器总是出现在发生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() { }
}