我们都知道发送异步请求后,后端会携带请求值返回到请求页面,是无法跳转到新页面的。
所以我这次在使用layui的表单时发送的ajax请求我修改了默认的异步请求。
$.ajax({
type:"post",
url:"login.do",
dataType:"text",
async:false, // 默认异步,改为false就可以变成同步请求
data:{"username":username,"password":password},
success:function(res){
layer.alert("欢迎");
}
})
但是后端的response.sendRedirect()方法依旧无法生效。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// 获取用户名和密码
String username = req.getParameter("username");
String password = req.getParameter("password");
// 将获取到的用户名和密码封装到token里
UsernamePasswordToken upToken = new UsernamePasswordToken(username,password);
// 创建subject
Subject subject = SecurityUtils.getSubject();
try {
subject.login(upToken);
if (subject.isAuthenticated()) {
resp.sendRedirect("index.jsp");
// resp.getWriter().print("{\"code\":\"0\"}");
}else{
}
} catch (Exception e) {
System.out.println("异常");
}
}
让我疑惑的是,网络监控没有监测到login.do的请求,后端怎么拿到的值,在后端没有其它报错,只有重定向方法不生效。
而且如果直接在地址栏将带值的地址:
http://localhost:8080/JavaProject20230520/login.jsp?username=u10001&password=123456
改为:
http://localhost:8080/JavaProject20230520/login.do?username=u10001&password=123456
是可以正常实现跳转的。
后来有位老哥告诉我,ajax请求就是不会主动刷新页面(问答详情http://t.csdn.cn/wOo1c)。也就是说要么请求成功后的success回调函数里使用 window.location.href=“url” 方法刷新页面,要么在要发送同步请求的时候老老实实的在表单里写上action和method:
<form class="layui-form" action="login.do" method="post">
以上就是我的解决办法,如有错误欢迎指正。