filter会执行两次?Why?

来源:互联网 发布:蜘蛛丝 芥川 知乎 编辑:程序博客网 时间:2024/06/07 00:37

 

        感觉自己真的太浅薄了,什么都不是很懂,什么都是一知半解,filter,http协议那只是一个缩影而已

        可以百度,google出来的问题都不叫问题吧

        那些不专业的人们啊,可不可以不要误人子弟?请不要随意在网上回答你不太懂的东西好吗?给网络一片净土吧

Ø        今天用eclipseJavaEE写了一个filter:

publicclass EncodeingFilter implements Filter {

    protected String encoding = null;

       protected FilterConfig filterConfig =null;

       public EncodeingFilter() {

    }

    public void destroy() {

    }

    public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException,ServletException {

       System.out.println("我是filter");

       System.out.println("title:"+req.getParameter("title"));

       chain.doFilter(request,response);

    }

    public void init(FilterConfig fConfig)throws ServletException {

       this.filterConfig = fConfig ;

       this.encoding = filterConfig.getInitParameter("encoding");

    }

}

 

Ø        如下配置:

<filter>

   <filter-name>EncodeingFilter</filter-name>

   <filter-class>a.b.filter.EncodeingFilter</filter-class>

   <init-param>

     <param-name>encoding</param-name>

     <param-value>UTF-8</param-value>

   </init-param>

</filter>

 <filter-mapping>

   <filter-name>EncodeingFilter</filter-name>

   <url-pattern>/*</url-pattern>

 </filter-mapping>

<servlet>

   <display-name>changeTitle</display-name>

   <servlet-name>changeTitle</servlet-name>

   <servlet-class>a.b.Servlet.changeTitle</servlet-class>

 </servlet>

<servlet-mapping>

   <servlet-name>changeTitle</servlet-name>

   <url-pattern>/changeTitle</url-pattern>

 </servlet-mapping>

Ø        下面是servlet: changeTitle.java

publicclass changeTitle extends HttpServlet {

    private static final long serialVersionUID =1L;

    protected void doGet(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException {

       doPost(request,response);

   

    }

    protected void doPost(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException {

       System.out.println("我是服务器");

        }

}

Ø        下面是servlet: sendTitle.jsp

<html>

<head>

<metahttp-equiv="Content-Type" content="text/html;charset=utf-8">

<title>Inserttitle here</title>

</head>

<body>

  <form action="http://localhost:8080/Web/changeTitle"method="post" >

          视频名称<inputtype="text" name="title">

  <input type="submit"value="    " >

</form>

</body>

</html>

 

Ø        sendTitle.jsp --run as-->Run on server结果是:

我是filter

title:null

我是filter

title:null

Ø        我清空控制台后,输入hu,点击提交后的结果是:

我是filter

title:hu

我是filter

title:hu

我是服务器

 

Ø        网上有人说:

l        打印两次是因为一次是请求到来打印的,一次是响应到来打印的,如果真的是这样子的话,打印的结果应该是:

我是filter

title:hu

我是服务器

我是filter

title:hu

l        2. chain.doFilter(request,sresponse);
Causes the next filter in the chain to be invoked, or if the calling filter isthe last filter in the chain, causes the resource at the end of the chain to beinvoked.

Ø        于是我就去掉chain.doFilter(request,sresponse);sendTitle.jsp --run as-->Run on server结果是:

我是filter

title:null

      然后sendTitle.jsp页面没有界面的显示,因为chain.doFilter(request, sresponse);的作用是把响应或请求继续向后传递,现在没有了后续,所以就停了

l        3.有人说一次是服务器监听到的,一次是运行时的

Ø           后来我重新写了一个工程,sendTitle.jsp --run as-->Run on server结果是:

   我是filter

   title:null

Ø           我清空控制台后,输入hu,点击提交后的结果是:

我是filter

title:hu

我是服务器

Ø           又有人说是xml文件的配置问题吧:

经过仔细检查我发现两个filter文件有一点不同

第一个开头是:

@WebFilter("/*")

public classEncodeingFilter implements Filter

第二个开头是:

@WebFilter("/titleFilter")

public classEncodeingFilter implements Filter

 

Ø        正解分析:

1.为什么打印两次?因为@WebFilter("/*")等价于<url-pattern>/*</url-pattern>

2.为什么有@WebFilter("/*")?因为New --->Filter--->输入文件名--->Next--->在Filtermappings--->

Edit-->/*,这样的操作后的结果并不会反映到web.xml中。

3.为什么两个同时有?我以为没有配置过filter,后来我自己又在web.xml加上了url-pattern>/*</url-pattern>