JSP/Servlet页面重定向 由David发表在天码营
页面重定向
在用户登录并通过服务器验证以后,JSP会渲染一段HTML内容返回给浏览器,提示已经登录成功。但这样做存在一些问题:
- 用户体验不佳,用户成功登录后肯定需要去其他页面。如果登录成功在系统的任何一个页面都应该在导航栏中看到用户信息,如果进入一个提示信息页面,还需要一次点击才能到达目标页面。
- 在登录成功页面刷新,此时浏览器会提示是否重新提交数据,因为这是一个POST请求,如果点击了确定意味着将之前的数据再次提交一遍,这不是我们所希望的。
上述问题对于任意表单提交都是存在的,包括文章创建表单。
POST/Redirect/GET模式
上一节中表单提交的用户体验非常不友好,为了解决这个问题,一种叫做Post/Redirect/GET的模式被提出并广泛应用在Web程序开发中。和传统的表单提交方法不同,这种模式在POST请求完成后,会重定向(HTTP状态码302)到另外一个页面。这样相当于浏览器重新加载了一个页面(使用GET请求),此时用户无论如何刷新浏览器,都是刷新当前GET请求对应的页面而不再是重复提交一次表单。下面是一个用户提交订单到服务器的过程描述:
Servlet重定向
页面重定向相当于返回HTTP状态吗302以及一个重定向地址到浏览器,在Servlet中可以使用HttpServletResponse#sendRedirect()
方法来完成。例如在登录成功后,可以跳转到该用户的博客首页:
@WebServlet("/account/login")
public class LoginController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = Data.getByUsername(username);
if (user == null || !user.getPassword().equals(password)) {
} else {
req.getSession().setAttribute("user", user);
resp.sendRedirect("/ServletBlogDemo/userPosts?username=" + user.getUsername());
}
}
}
注意这里的重定向地址需要包含本身的Context名字——ServletBlogDemo
。
例子:创建文章重定向
和登录表单一样,创建文章表单提交成功后,直接跳转到该文章详细页面,这样用户自然而然的知道文章已经创建成功:
@WebServlet("/createPost")
public class PostCreateController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User currentUser = (User) req.getSession().getAttribute("user");
Post post = new Post(req.getParameter("title"), req.getParameter("content"), currentUser);
Data.posts.add(post);
resp.sendRedirect("/ServletBlogDemo/userPosts?username=" + currentUser.getUsername());
}
}
在通常情况下,表单通过POST方法提交数据后,我们推荐使用HTTP状态码302进行重定向来实现更友好的用户体验。