您的位置:首页 > 产品设计 > UI/UE

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

2017-07-20 15:07 1121 查看
首先要清楚,过滤的是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 结束》》》》》》》》》》》》》》


希望通过我的讲解能让大家对跳转过滤有一定了解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javaweb filter 过滤器
相关文章推荐