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

首先要清楚,过滤的是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("终止!!!!!!!!");
    }
}

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)对于请求转发;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终止!!!!!!!!");
    }
}

运行结果

[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 结束》》》》》》》》》》》》》》

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

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值