JavaWeb Filter 过滤器的机制 与使用 请求重定向与请求转发的区别 跳转过滤,过滤器dispatcher REQUEST与FORWARD区别
2017-07-20 15:07
1121 查看
首先要清楚,过滤的是url
那么所有页面跳转url都会变吗?不会,比如请求转发,前前后后都是一个url
首先要弄清请求重定向与请求转发的区别;
举例来说有两个网页index.jsp 然后分别通过两种方式跳转到main.jsp
相当于index.jsp说交给我,然后偷偷外包给main.jsp去处理
最常见,是用户业务流程的延续,相当于用户请求一个页面,然后该页面交给另一个页面处理,url不变,用户是察觉不到的
从index.jsp请求转发到main.jsp
- url不变,内容是main.jsp的内容,url还是index.jsp;
- 用户请求与提交数据都保留,可以继续处理;
- 用户察觉不到
相当于index.jsp说我不管了,你找别人吧
然后用户重新递交请求到main.jsp,两次独立请求,url肯定变,跳转到一个完全无关的新访问;
对比两次可以知道,两种跳转本质完全不同,如果建立一个SimpleFilter过滤器 内容是跳转;
过滤/index.jsp与/main.jsp两个url,代码如下;
SimpleFilter.java
web.xml
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
运行结果
希望通过我的讲解能让大家对跳转过滤有一定了解
那么所有页面跳转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 结束》》》》》》》》》》》》》》
希望通过我的讲解能让大家对跳转过滤有一定了解
相关文章推荐
- 内部跳转(请求转发)request.getRequsetDispatcher()和外部跳转(重定向)response.sendRedirect()的区别
- JAVA 的服务器重定向:使用forward()方法转发请求和使用 sendRedirect()方法重定向的区别
- JAVA 的服务器重定向:使用forward()方法转发请求和使用 sendRedirect()方法重定向的区别
- Java Web 回顾总结(五) - HttpServlet - Request - 重定向 与 请求转发
- sendRedirect(重定向)与getRequestDispatcher.forward(转发)的区别 用实例说话!
- java web工程中关于redirect重定向和forward页面转发的区别
- HttpServletResponse.sendRedirect方法实现的请求重定向与RequestDispatcher.forward方法实现的请求转发的总结比较
- 【JavaWeb】简述 jsp 页面的工作原理以及请求转发和重定向的区别
- javaweb之request请求转发forward方法的细节
- 请求重定向与请求转发的比较(HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法)
- 在JAVA中使用response.sendRedirect和使用RequestDispatcher.forward的区别
- 使用java的自定义过滤器Filter 处理请求request 并响应response
- Servlet 使用getRequestDispatcher进行请求转发页面未跳转 后台也未报错的问题的解决方法
- 请求重定向与请求转发的比较(HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法)
- javaweb-day06-4&5&6 (Servlet-Request-方法、表单获取客户端中文信息、URL编码、Request容器和请求转发、RequestDispatcher.include()
- Jsp重定向(response.sendRedirect())和转发(request.getRequestDispatcher().forward(request,r)的区别
- javaWeb_14-request实现请求转发和mvc设计模式
- struts2中的跳转详解 ----“请求转发”和“重定向”之间的区别
- 请求的跳转与转发 forward, redirect的区别
- 深入浅出Java 重定向和请求转发的区别