赞
踩
首先要清楚,过滤的是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 结束》》》》》》》》》》》》》》
希望通过我的讲解能让大家对跳转过滤有一定了解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。