您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 关于Java中redirect与forward的区别
关于Java中redirect与forward的区别五月14,20136条评论今天遇到了一个超级郁闷的问题,在公司的门户上做了二开,理想的效果是用户通过我给定的URI提交数据之后,若数据正确跳转到首页,若错误则跳转到登录页。修改完成之后部署上,发现无论用户给出的凭据是正确还是错误都往错误页上跳转。调试过程中我发现,用户输入正确的凭据以后系统确实往主页跳转了,但是最后的结果却是又返回到了登录页。仔细查看代码后发现,我在往主页跳转的时候,错误的使用了forward,造成不能将用户本地的cookie等凭证带到主页,令系统以为我已经退出了,故又返回了登录页。关于redirect与forwad的区别,找到一篇博文,见下:(转载自:)在Servlet中两种实现:forward方式:request.getRequestDispatcher(“/somePage.jsp”).forward(request,response);redirect方式:response.sendRedirect(“/somePage.jsp”);forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道;redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一次,这里多了两次网络通信的来往。当然forward也有缺点,就是forward的页面的路径如果是相对路径就会有些问题了。forward会将requeststate,bean等等信息带往下一个jspredirect是送到client端后再一次request,所以资料不被保留.使用forward你就可以用getAttribute()来取的前一个jsp所放入的bean等等资料forward是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取。redirect是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,forward更加高效,在forward可以满足需要时,尽量使用RequestDispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。forward与include共亨Request范围内的对象,而redirect则不行,即:如果一个javabean被声明为request范围的话,则被forward到的资源也可以访问这个javabean,而redriect则不行。2、forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如:req.sendRedriect(“”);forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,而客户机并不知晓;forward会将requeststate、bean、等信息带到下一个jsp页面;使用getAttribute()来取得前一个jsp所放的信息redirect是服务器收到请求后发送一个状态头给客户,客户将再次请求,就有两次网络通行的来往。redirect是送到客户端后再次request,因此上一个jsp的信息不被保留forward方式:request.getRequestDispatcher(“/somePage.jsp”).forward(request,response);redirect方式:response.sendRedirect(“/somePage.jsp”);redirectforward的区别1.从地址栏显示来说forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。2.从数据共享来说forward:转发页面和转发到的页面可以共享request里面的数据.假如从a页面到b页面在到c页面如果用在a页面中:request.setAttribute(“a”,”aa”);jsp:forwardpage=”b.jsp”/jsp:forward在b页面中:jsp:forwardpage=”c.jsp”/jsp:forward跳转在c页面用request.getAttribute(“a”)就可以得到a页面的值,或者用request.getParameter(“name”)也可以得到。但是要用response.sendRedirect(“b.jsp”);跳转的话就得不到a页面的值和内容。redirect:不能共享数据.redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.forward,方法只能在同一个Web应用程序内的资源之间转发请求.forward是服务器内部的一种操作.redirect是服务器通知客户端,让客户端重新发起请求.所以,你可以说redirect是一种间接的请求,但是你不能说”一个请求是属于forward还是redirect”3.从运用地方来说forward:一般用于用户登陆的时候,根据角色转发到相应的模块.redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.4.从效率来说forward:高.redirect:低.5.jsp语法jsp:forwardpage={“relativeurl”|“%=expression%”}/或者这样写:jsp:forwardpage={“relativeurl”|“%=expression%”}jsp:paramname=”parametername”value=”{parametervalue|%=expression%}”/+/jsp:forward6.例子jsp:forwardpage=”/servlet/login”/jsp:forwardpage=”/servlet/login”jsp:paramname=”username”value=”jsmith”//jsp:forward描述jsp:forward标签从一个jsp文件向另一个文件传递一个包含用户请求的request对象.jsp:forward标签以下的代码,将不能执行.你能够向目标文件传送参数和值,在这个例子中我们传递的参数名为username,值为scott,如果你使用了jsp:param标签的话,目标文件必须是一个动态的文件,能够处理参数.如果你使用了非缓冲输出的话,那么使用jsp:forward时就要小心。如果在你使用jsp:forward之前,jsp文件已经有了数据,那么文件执行就会出错.属性page=”{relativeurl|%=expression%}”这里是一个表达式或是一个字符串用于说明你将要定向的文件或url.这个文件可以是jsp,程序段,或者其它能够处理request对象的文件(如asp,cgi,php).jsp:paramname=”parametername”value=”{parametervalue|%=expression%}”/+向一个动态文件发送一个或多个参数,这个文件一定是动态文件.如果你想传递多个参数,你可以在一个jsp文件中使用多个jsp:param。name指定参数名,value指定参数值.jsp:forward例子%@pagecontentType=”text/html;charset=gb2312″%htmlheadtitletest/title/headbodyjsp:forwardpage=”forwardTo.jsp”jsp:paramname=”userName”value=”riso”//jsp:forward/body/htmlforwardTo.jsp%@pagecontentType=”text/html;charset=gb2312″%!–forwardTo.jsp–%StringuseName=request.getParameter(“userName”);StringoutStr=“谢谢光临!”;outStr+=useName;out.println(outStr);%redirect的例子:譬如:client通过XXX/index.jsp?name=gauss&pwd=123访问index.jsp,而index.jsp中有jsp:forwardpage=”login.jsp”/,则在login.jsp中可以通过request.getParameter()得到name和pwd,而%response.sendRedirect(“login.jsp”);%得不到。总结:A.Redirect等于客户端向服务器发出两次request,同时也接受到两次responseForward却只是一次request一次response相比之下,Forward性能更高。B.Forward能够存储requestScope的Attribute而Redirect却不行。C.Forward的同时URL并不会变。D.Forward需要在Servlet中需要通过一个Dispatcher来实现。E.Redirect能够防止某些情况下客户端Refresh造成的一些未知后果(例如连续删除)
本文标题:关于Java中redirect与forward的区别
链接地址:https://www.777doc.com/doc-2665532 .html