关于Fileter中重定向和转发的问题(在Servlet中进行操作)

来源:互联网 发布:seo代码优化 编辑:程序博客网 时间:2024/06/08 07:40

关于Fileter中重定向和转发的问题(在Servlet中进行操作)

web.xml中的配置

<filter>    <filter-name>MyFilter</filter-name>    <filter-class>web.filter.MyFilter</filter-class>  </filter>  <filter-mapping>    <filter-name>MyFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>

这是Filter的实现类

package web.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class MyFilter implements Filter{    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        System.out.println("myfilter");        chain.doFilter(request, response);    }    @Override    public void destroy() {    }}

这是第一个HttpServlet的实现类

package web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Servlet1 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        response.getWriter().write("我是servlet1");        System.out.println("servelt1执行了");//      request.getRequestDispatcher("/servlet2").forward(request, response);        response.sendRedirect(request.getContextPath()+"/servlet2");    }    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }}

这是第二个HttpServlet的实现类

package web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Servlet2 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        response.getWriter().write("我是servlet2");        System.out.println("servelt2执行了");    }    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }}

当url为 localhost:8080/web24/servlet1时,执行结果为:
myfilter
servelt1执行了
myfilter
servelt2执行了
分析:myfilter执行了两次,重定向的时候还会被过滤。

这时候,把实现类servlet1 中doGet(xxx) 方法中的改为转发,把重定向注释掉。

package web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Servlet1 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        response.getWriter().write("我是servlet1");        System.out.println("servelt1执行了");        request.getRequestDispatcher("/servlet2").forward(request, response);//      response.sendRedirect(request.getContextPath()+"/servlet2");    }    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }}

当url还是为 localhost:8080/web24/servlet1时,执行结果为:
和上面一样,显然转发没有再次被过滤(就一次请求,在服务器中跳转当然不被过滤)

阅读全文
0 0
原创粉丝点击