当前位置:   article > 正文

JavaWeb Filter 过滤器的机制 与使用 请求重定向与请求转发的区别 跳转过滤,过滤器dispatcher REQUEST与FORWARD区别_filter 不过滤重定向的url吗

filter 不过滤重定向的url吗

首先要清楚,过滤的是url

那么所有页面跳转url都会变吗?不会,比如请求转发,前前后后都是一个url
首先要弄清请求重定向与请求转发的区别;
举例来说有两个网页index.jsp 然后分别通过两种方式跳转到main.jsp

请求转发

服务器端行为,可以理解为“内部处理”内容变,url不变
相当于index.jsp说交给我,然后偷偷外包给main.jsp去处理

最常见,是用户业务流程的延续,相当于用户请求一个页面,然后该页面交给另一个页面处理,url不变,用户是察觉不到的

从index.jsp请求转发到main.jsp
请求转发
- url不变,内容是main.jsp的内容,url还是index.jsp;
- 用户请求与提交数据都保留,可以继续处理;
- 用户察觉不到

请求重定向

客户端行为,可以理解为重新开始,纯跳转 url改变

相当于index.jsp说我不管了,你找别人吧

然后用户重新递交请求到main.jsp,两次独立请求,url肯定变,跳转到一个完全无关的新访问;
请求重定向

对比两次可以知道,两种跳转本质完全不同,如果建立一个SimpleFilter过滤器 内容是跳转;
过滤/index.jsp与/main.jsp两个url,代码如下;

SimpleFilter.java

import com.sun.net.httpserver.Filter;

import javax.servlet.*;
import java.io.IOException;

/**
 * Created by XUH-h on 2017/7/20.
 */
public class SimpleFilter implements javax.servlet.Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter 初始化************");

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter 开始》》》》》》》》》》》》》》");
        /*filterChain.doFilter(servletRequest, servletResponse);*/
        System.out.println("首次监听启动");
        servletRequest.getRequestDispatcher("main.jsp").forward(servletRequest, servletResponse);
        System.out.println("Filter 结束》》》》》》》》》》》》》》");

    }

    @Override
    public void destroy() {
        System.out.println("终止!!!!!!!!");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

web.xml

    <filter>
        <filter-name>SimpleFilter</filter-name>
        <filter-class>SimpleFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SimpleFilter</filter-name>
        <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>
        <filter-mapping>
        <filter-name>SimpleFilter</filter-name>
        <url-pattern>/main.jsp</url-pattern>
    </filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1)对于请求转发;forward跳转到main.jsp url不变,因此过滤器只过滤一次/index.jsp的访问;
当然这是针对dispatcher类型是默认的REQUEST而言,如果将dispatcher类型改为FORWARD,那么即使url不变,也可以过滤Forward跳转行为,然后就会死循环访问main.jsp;

2)对于请求重定向,url一直变,然后一直过滤,一直死循环

3)如果想要监听对main.jsp的forward行为,最好另写一个过滤器SimpleFilter2,dispatcher类型为FORWARD,那么每当index.jsp偷偷跳转到main.jsp时就可以有相应的操作;如下

SimpleFilter2.java

import javax.servlet.*;
import java.io.IOException;

/**
 * Created by XUH-h on 2017/7/20.
 */
public class SimpleFilter2 implements javax.servlet.Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter2 初始化************");

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter2 开始》》》》》》》》》》》》》》");
        /*filterChain.doFilter(servletRequest, servletResponse);*/
        System.out.println("FORWARD跳转监听启动");
        filterChain.doFilter(servletRequest, servletResponse);

        System.out.println("Filte2 结束》》》》》》》》》》》》》》");

    }

    @Override
    public void destroy() {
        System.out.println("2终止!!!!!!!!");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

运行结果

[2017-07-20 01:52:49,242] Artifact FilterDemo:war exploded: Artifact is deployed successfully
[2017-07-20 01:52:49,242] Artifact FilterDemo:war exploded: Deploy took 615 milliseconds
Filter 开始》》》》》》》》》》》》》》
首次监听启动
Filter2 开始》》》》》》》》》》》》》》
FORWARD跳转监听启动
主界面MAIN》》》》》》》
Filte2 结束》》》》》》》》》》》》》》
Filter 结束》》》》》》》》》》》》》》
Filter 开始》》》》》》》》》》》》》》
首次监听启动
Filter2 开始》》》》》》》》》》》》》》
FORWARD跳转监听启动
主界面MAIN》》》》》》》
Filte2 结束》》》》》》》》》》》》》》
Filter 结束》》》》》》》》》》》》》》
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

希望通过我的讲解能让大家对跳转过滤有一定了解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/思考机器3/article/detail/61367
推荐阅读
相关标签
  

闽ICP备14008679号