response.sendredirect
一 、sendRedirect
1.1 重定向过程:
当使用HttpServletresponse的sendRedirect()时会发生重定向时,服务器会在Servlet中设置HTTP状态码为301以及Location标头返回给浏览器,浏览器收到这个标头以后会再一次使用GET方法请求重定向的URL,因此地址栏的URL会发生变化。
1.2 sendRedirect使用方法
response.sendredirect(URL url);
二实验
2.1使用sendRedirect()进行重定向,同时使用HttpServletrequest中的setAttribute进行属性设置
在浏览器中输入http://localhost:8088/send_redirect.html
send_redirect.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
Name:<input type="text" name="name"/><br/>
Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>
点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect
服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;
SendRedirectServlet.java
package httpservletresponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getparameter("name");
response.setcontenttype("text/html");
request.setattribute("name",name);
//setAttribute("name",name);
response.sendRedirect("http://localhost:8088/welcome.jsp");
}
}
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
Welcome<br/>
${name}
</body>
</html>
最后输出的结果为
结果分析:我们发现我们在request中设置的name属性并没有传递到welcome的request对象中。而welcome.jsp中的request对象不存在一个name 属性值,所以不输出
2.1使用sendRedirect()进行重定向,同时使用HttpServletRequest中的setAttribute进行属性设置
在浏览器中输入http://localhost:8088/send_redirect.html
send_redirect.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
Name:<input type="text" name="name"/><br/>
Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>
在网页的Name这一栏输入Yanzi
点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect
服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;
SendRedirectServlet.java
package httpservletresponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
response.setContentType("text/html");
this.getServletcontext.setAttribute("name",name);
//setAttribute("name",name);
response.sendRedirect("http://localhost:8088/welcome.jsp");
}
}
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
Welcome<br/>
${name}
</body>
</html>
结果输出
结果分析:我们通过ServletContext来设置的属性,最后能够在重定向的welcome.jsp中得到这个属性值,最终输出在浏览器上。因此如果我们需要在重定向的时候设置共享的变量,那么我们需要使用的ServletContext来设置属性。同时我们可以看到url地址栏变成了我们设置的重定向的地址
2.3使用sendRedirect()进行重定向,但是我们重定向的资源放在WEB-INF文件夹下
在浏览器中输入http://localhost:8088/send_redirect.html
send_redirect.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/send_redirect" method="post">
Name:<input type="text" name="name"/><br/>
Submit:<input type="submit" value="Submit By Post"/>
</form>
</body>
</html>
在网页的Name这一栏输入Yanzi
点击Submit By Post,浏览器的地址栏会变成http://localhost:8088/send_redirect
服务器根据”/send_redirect”就会去服务器的web.xml找到对应的url-pattern最后找到对应的Servlet来处理;或者是根据@WebServlet来查找对应的Servlet;
SendRedirectServlet.java
package httpservletresponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/send_redirect")
public class SendRedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
response.setContentType("text/html");
this.getServletContext.setAttribute("name",name);
//资源路径为WEB-INF文件夹下
response.sendRedirect("http://localhost:8088/WEB-INF/welcome.jsp");
}
}
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
Welcome<br/>
${name}
</body>
</html>
结果输出
结果分析:我们将我们重定向的资源放在了WEB-INF文件夹下,所以浏览器是无法访问到的。这是重定向和转发之间的一个不同点,转发有服务器自己处理转发请求,但是重定向是浏览器对重定向的资源再一次进行请求。这从请求次数上,转发只请求一次,但是重定向至少请求两次。
三、总结
RequestDispatcher的forward()和HttPServletResponse的sendRedirect()之间的不同
1) foward()就可以访问WEB-INF文件夹下的资源,而sendRedirect()不能重定向在WEB-INF文件夹下的资源
2) forward()进行转发时是服务器内部进行处理,因此浏览器不知道发生的变化,所以浏览器的URL不会发生变化,而sendRedirect()会发生变 换,是因为浏览器会从服务器得到301状态码以后会再一次按照重定向的URL以get的方式请求服务器。所以服务器地址栏的URL发生变化
3) forward()可以通过HttpServletRequest的setAttribute()和ServletContex的setAttribute()设置共享属性。而sendRedirect()只能通过ServletContext()的setAttribute()进行访问属性(其实二者另外还都可以使用session来存储共享的数据)
相关阅读
首先我们要知道为何做301重定向,做301重定向的目的是什么?1、我们购买的域名一般为(seo-6.com),seo-6为我们的自定义域名,.com为顶级后
原文地址为:Nginx 301重定向域名为何要使用301重定向 在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名、网页
301重定向,从“重定向”的意思本身我们能明确是指向一个新的地址。也就是说是将现在的地址重新指向一个新的地址。大白
英文原文地址为:How do I redirect to another webpage?How can I redirect the user from one page to another using jQuery or
做301url重定向的原因是因为网站301重定向在网站优化中常见,由于某些因素导致需要做301,如www和不带www,互联网上内容重复,使其搜索引