java中的302和sendRedirect的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的302和sendRedirect的区别相关的知识,希望对你有一定的参考价值。
我认为他们之间的关系不太明朗,应该是sendRedirect和forward比较的,301与302比较的。sendRedirect是服务器重定向后将url发回给客户端,客户端重新向新的url发送请求,于是url会在浏览器明显的发生跳转,而forward是直接就在服务器端完成了跳转,客户端丝毫不会觉察。
302是代表暂时性转移,也就是在服务器端发生的跳转,和forward有点类似,但它们是俩种东西,只是原理类似,这种方式较容易发生一个问题,容易发生url劫持。 参考技术A java中的302和sendRedirect的区别:
sendRedirect是服务器重定向后将url发回给客户端,客户端重新向新的url发送请求,于是url会在浏览器明显的发生跳转,而forward是直接就在服务器端完成了跳转,客户端丝毫不会觉察。
302是代表暂时性转移,也就是在服务器端发生的跳转,和forward有点类似,但它们是俩种东西,只是原理类似,这种方式较容易发生一个问题,容易发生url劫持。 参考技术B sendRedirect的相对路径是服务器自己计算的,如果外部有代理的话,web server意识不到可能相对地址出错
302完全手动指定,不灵活但可靠
关于java中sendRedirect,forward和include区别
在javaWeb中页面跳转一般有三种形式,sendRedirect,forward和include,三者有什么区别呢?
我先进行说明,再以一个小例子说明
一、sendRedirect
使用方式
response.sendRedirect();
服务器根据逻辑,发送一个状态码,告诉浏览器去请求指定的地址,把需要的参数放在转发的地址里面。由于是一次新的申请,原先的request就不能读取了,可以使用session代替,或者使用include,和forward代替
二、forward
使用方式
request.getRequestDispatcher("/first.jsp").forward(request, response);
页面会是first.jsp的内容,地址栏不变
可以使用设置属性
三、include
使用方式
request.getRequestDispatcher("/first.jsp").include(request, response);
页面会同时包含当前页面和first.jsp的内容
可以使用设置属性
下面是一个例子
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>index.jsp 页面</h1>
<a href="first.jsp">first.jsp</a><br/>
<a href="first.jsp?id=123456">first.jsp带id123456</a><br/>
<a href="second.jsp">second.jsp</a><br/>
<a href="second.jsp?id=123456">second.jsp带id123456</a><br/>
<a href="third.jsp">third.jsp</a><br/>
<a href="third.jsp?id=123456">third.jsp带id123456</a><br/>
可以获取id为:<%=request.getParameter("id") %>
</body>
</html>
first.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>first.jsp 页面</h1> 提交的ID:<%=request.getParameter("id")%> <% response.sendRedirect(request.getContextPath()+"/index.jsp"); System.out.println("first.jsp有访问过了"); %> </body> </html>
second.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>second.jsp 页面</h1> <% request.getRequestDispatcher("/index.jsp").forward(request, response); %> 提交的ID:<%=request.getParameter("id")%> </body> </html>
third.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>third.jsp 页面</h1> 提交的ID:<%=request.getParameter("id")%> <% request.getRequestDispatcher("/fourth.jsp").include(request, response); request.getRequestDispatcher("/index.jsp").include(request, response); %> <hr> </body> </html>
fourth.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>fourth.jsp 页面</h1> <hr> </body> </html>
接下来运行服务器(使用的是TomCat8.0)
访问项目
点击第一个链接
页面没有变化,但是控制台有输出,表示访问过了
我们试着传一个参数过去id=123456
不能获取id,说明是浏览器重新发出的一个请求,request已经被销毁,这个是一个新的request
下面放上流程图
点击第三个连接
页面没有变化,但是地址栏发生变化
我们传一个参数进去
有了,可以显示id,说明是同一个request
下面放上流程图
因为forward是服务器内部跳转,会带着request一起到下一个页面,所以id可以获得
接着点击第五条链接
页面发生变化,同时包含了,third.jsp和fourth.jsp的内容
我们传一个参数
可以获得request
下面是流程图
本人知识有限,如有错误,望指出
此文系原创,转载请声明出处。
以上是关于java中的302和sendRedirect的区别的主要内容,如果未能解决你的问题,请参考以下文章
java 中sendredirect()和forward()方法的区别
关于java中sendRedirect,forward和include区别