Servlet转发forward和重定向response.sendRedirect()区别

1.两者区别
重定向是在客户端发生的,URL地址栏变化,可以定向到任何服务器的资源;

转发是发生在服务器内部的,浏览器地址栏不变化,只能转发本服务器的资源。
2.使用方法
重定向使用:response.sendRedirect(url);

转发时使用:request.getRequestDispatcher(url).forward(request,response);
3.禁用Cookie时,如何使用Session
session虽然是服务器端的,但是在浏览器再次访问其他servlet时,服务器如何知道是否为同一客户端?其实,在浏览器访问session资源后,服务器会发送一个set-cookie响应,此cookie不是存在本地的,存在浏览器内部,所以说session是基于cookie的。但是当浏览器禁用所有cookie时,cookie存不进去,服务器如何分辨客户机呢?

使用URL重写,即将session产生的id设置在URL上,浏览器每次访问,都带着此后缀,所以无论是否禁用cookie,都能访问同一session资源,方法如下:
重定向URL使用
String url = response.encodeRedirectURL(url);

response.sendRedirect(url);
非重定向URL使用
String url = response.encodeURL(url);

response.getRequestDispatcher(url).forward();

表单action和超链接也同样适用
4.其他区别
a. RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

b. 如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。

c. 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

d. HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。

e. RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

上文链接:
链接:https://www.jianshu.com/p/2464779932bd

笔者踩坑那些事——跳转之url地址出问题,不同的转发方式对应的相对地址可能不同,大家多踩踩坑!必踩坑。
----------------------------------------------------------------------------------------------------------------------
最后通过自己的经验总结如下:

重定向
客户端跳转 加’/'会报错 代表的是服务器根目录 tomcat/webapps/ 代表这里面的内容

Servlet转发
内部转发 代表tomcat/webapps/项目

最佳方式:
转发一律带’/’
重定向 不带’/’

注:水平有限,欢迎指出问题

你可能感兴趣的:(JavaWeb)