而页面重定向仍然是基于这样的原理,浏览器客户端第一次向Web容器发起HTTP请求,执行到一半,具体的Servlet子类将需要使用的另一个资源的路径告诉给浏览器客户端,浏览器客户端收到后立刻发起第二次HTTP请求,进而获取到相应地资源。
更加官方一点,页面重定向就是:指 Web 服务器接收到客户端的请求后,可能由于某些条件的限制,不能访问当前请求 URL 所指向的 Web 资源,而是指定了一个新的资源路径,让客户端重新发送请求。
public void sendRedirect(java.lang.String location) throws java.io.IOException
302响应码:以3开头表示重定向,302表示临时替换原始URI;
Location 响应头:HTTP响应头信息,表示客户端所要获取的资源路径。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<!-- 把表单内容提交到 servletDemo1工程下的 ReDirectPageServlet -->
<form action="/servletDemo1/redirectpageservlet" method="POST">
用户名:<input type="text" name="username"><br/>
密 码:<input type="password" name="password"/><br/>
<br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎页面</title>
</head>
<body>
欢迎你,登陆成功!
</body>
</html>
package com.xwd.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @ClassName ReDirectPageServlet
* @Description: com.xwd.servlet
* @Auther: xiwd
* @Date: 2022/2/1 - 02 - 01 - 18:30
* @version: 1.0
*/
public class ReDirectPageServlet extends HttpServlet {
//methods
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp);
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doPost(req, resp);
//获取请求参数值
String uname=req.getParameter("username");
String pswd=req.getParameter("password");
if (null!=uname&&pswd!=null) {
if ("root".equals(uname)&&"root".equals(pswd)){
resp.sendRedirect("/servletDemo1/welcome.html");
return;
}
}
resp.sendRedirect("/servletDemo1/login2.html");
}
}
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>login.htmlwelcome-file>
welcome-file-list>
<servlet>
<servlet-name>redirectpageservletservlet-name>
<servlet-class>com.xwd.servlet.ReDirectPageServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>redirectpageservletservlet-name>
<url-pattern>/redirectpageservleturl-pattern>
servlet-mapping>
web-app>
function login() {
//获取账户名和密码
var username = $("#inputuserinfo").val();
var password = $("#passwordInput").val();
console.log(username,password);
var dataJson = JSON.stringify({
uname:username,
pswd:password
});
//发送ajax请求
$.ajax({
url:"http://localhost:8010/servletDemo1/login",
async:true,
cache:false,
data:{
uname:username,
pswd:password
},
// dataType:"json",
type:"post",
success:function (result) {
console.log(result);
}
})
}
请注意,上述提及页面重定向是“浏览器”与“Web容器/Web服务器”之间的交互,而现在,让ajax取代浏览器简介向Web容器/Web服务器发送了HTTP请求,结果自然直接被ajax所解析,那么,在后端代码中控制页面跳转的代码将要控制的对象动作自然就失效了。
此处有不对的地方,敬请指正。