日期:2014-05-16  浏览次数:20407 次

jsp页面跳转方法及区别
当前项目需求:需要在SSH项目中使用Spring Security作为用户权限管理,在客户端使用ExtJS实现。需要在用户登陆一段时间没有操作时,提示登陆超时,回到登陆页面。

这里首先介绍一下jsp中实现页面跳转的两种常用方法,及与普通http跳转请求(如直接输入网址)之前的区别。

在项目的web.xml中加入自己实现Filter接口的过滤器,实现对指定的请求进行转发。

1、 通过dispatcher的forward方法实现转发,如
request.getRequestDispatcher("/login.jsp").forward(request, response);


2、 通过HttpServletResponse的sendRedirect方法实现跳转,如
responseHttp.sendRedirect(requestHttp.getContextPath()+"/login.jsp")


上面这两种方法在请求响应之前,都能实现转发,但是又有不同。
forward方法只是在后台进行转发,客户端并不知道它发出的请求发生了转换,如客户端需要向后台请求A资源,但后台发现A资源不是A所有,这时后台使用forward转发请求到拥有A资源的B这里,之后由B返回给客户端,所以客户端这时并不知道A资源不是它所以的A所提供的!
sendRedirect方法,后台并不像上者那样作为一个中介方,后台若发现客户端请求的A资源不在A这里,则返回客户端A资源的正确路径,这时客户端再次发送请求。

但需要注意的是,上面提到的两种方法,并不是每种请求都有效的。这里就是它们和直接输入网址的区别。当客户端发出的请求时Ajax异步请求时,该请求本身并没有跳转页面的请求,只是获取后台数据,这时上面的两种方法都是不能实现跳转的,因为后台是没有权利要求客户端实现页面刷新的,这也是说请求必须是在响应请求之前转发。
1 楼 skypengyc 2011-05-10  
楼主幸苦啦
2 楼 yangyi 2011-05-10  
后者本质上是返回一个302的response,header部分声明location为临时的转发地址
3 楼 kjkhi 2011-05-11  
yangyi 写道
后者本质上是返回一个302的response,header部分声明location为临时的转发地址

这次我并没有详细去观察forward和sendRedirect这两种方法header部分的区别。但是我遇到的问题是:当我需要转发一个action请求时,如"test_test"(在Struts.xml声明_的后面为action,前面为方法),这时sendRedirect可以达到预计的效果,但是forward并不能实现转发!
4 楼 aiyanbo 2011-05-13  
forward 在同一个request 里,redirect 不在同一个request 里。 所以,当您使用redirect时: 浏览器的地址栏会发生改变,forward则不会改变! 
5 楼 aiyust070 2011-05-13  
楼上说的一样
request.getRequestDispatcher("/login.jsp").forward(request, response);   此时相当于一中间过程,并带有请求前的信息,与请求后的信息

responseHttp.sendRedirect(requestHttp.getContextPath()+"/login.jsp")   是一定要转发的,且不带原始页面参数,
6 楼 fanfubao 2012-05-25  
博主有SSH2+Extjs+spring security的源码吗?我整合的好久,也没把spring security整合进去,总是有错,想看看你是怎么配置的。
7 楼 kjkhi 2012-08-30  
fanfubao 写道
博主有SSH2+Extjs+spring security的源码吗?我整合的好久,也没把spring security整合进去,总是有错,想看看你是怎么配置的。

已经没有源码了