必威体育Betway必威体育官网
当前位置:首页 > IT技术

Javaweb-HttpServletResponse的sendRedirectch重定向

时间:2019-10-19 16:12:13来源:IT技术作者:seo实验室小编阅读:69次「手机版」
 

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>

网页的Name这一栏输入Zoubaitao

这里写图片描述

点击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重定向,做301重定向的目的是什么?1、我们购买的域名一般为(seo-6.com),seo-6为我们的自定义域名,.com为顶级后

Nginx 301重定向域名

原文地址为:Nginx 301重定向域名为何要使用301重定向 在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名、网页

什么是301重定向,具体是什么意思?

301重定向,从&ldquo;重定向&rdquo;的意思本身我们能明确是指向一个新的地址。也就是说是将现在的地址重新指向一个新的地址。大白

如何重定向到另一个网页?

英文原文地址为:How do I redirect to another webpage?How can I redirect the user from one page to another using jQuery or

网站301重定向怎么做

做301url重定向的原因是因为网站301重定向在网站优化中常见,由于某些因素导致需要做301,如www和不带www,互联网上内容重复,使其搜索引

分享到:

栏目导航

推荐阅读

热门阅读