servlet中常用到的两种转向,之前没注意到这两种转向的区别,现在进行下记录与分享。
1.从地址显示来说
forward是服务器请求资源,比如你转向的地址为2.jsp,这时服务器先自己直接访问2.jsp,把这个地址的内容读出来,然后把这些内容再发给浏览器。所以地址栏还是你访问servlet那个地址栏(如果你用jsp实现地址就不变),它不会变成2.jsp。浏览器不知道这些内容是服务器从地址2.jsp拿过来的。redirect则相反,是服务端根据逻辑,发送一个状态码高速浏览器重新去请求那个2.jsp地址,所以地址栏显示的是新的URL。
2.从数据共享来说
forward转发页面和转发到的页面可以共享request里面的内容;redirect不能共享数据。3.从运用地方来说
forward一般用于用户登录时候,根据角色转发到相应的模块(因为这时可能需要共享些数据)。 redirect一般用于用户注销登录时返回主页面和跳转到其他的网站。4.forward不能跨域访问,redirect可以跨域访问
可能有些读者还不清楚跨域访问的概念。跨域访问就是post/get不是你自己的网站、域名不同的访问。5.从协议的角度来说
forward的实现与协议无关。从原理上看,forward是container内部在response之前对request的处理。 而redirect方式是利用http协议中的redirect机制让客户发起新的请求,转向新的url。从这个角度去看两者的区别,自然能很好地解析产生上面四点的不同的原因了。
所以,在处理登录/注销页面的转向时,要注意forward与redirect所带来的不同效果
下面做了一个例子来验证 逻辑如下1.jsp点击登录→servlet①给request写入attribute②进行forward或redirect转向→2.jsp 1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>登录servlet
public class OutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //测试是不是共享request request.setAttribute("name", "test"); //进行forward转向 // request.getRequestDispatcher("./2.jsp").forward(request, response); //进行redirect转向 response.sendRedirect("./2.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>My JSP '2.jsp' starting page 测试是不是共享reques
结果:<%=request.getAttribute("name")%>