实验
Cookie一个常见的应用,就是实现用户自动登录功能。在用户登录窗口,应该经常看到有个自动登录的选项,登录时若有选取该选项,下次再登录该网站时,就不用再输入名称密码,可以直接登录。
原理:当用户访问index.do时,会先取得所有的Cookie,然后一个一个检查是否有Cookie存储名称user且值为zhangsan。
如果有,则表示先前用户登录时,曾经选取“自动登录”选项,因此直接转发至user.view。
如果没有,则表示用户是初次访问,或者先前没有选取"自动登录"选项,此时转到login.html。login.html填写信息发送给login.do进行注册,login.do注册成功后转发到user.view。
流程:
保存会话数据的两种主要技术:
Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
src下创建controller包,包下包含Login.java和Index.java
再次创建view包,包下创建User.java
Login.java:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String user = request.getParameter("user");
String passwd = request.getParameter("passwd");
if("zhangsan".equals(user) && "123456".equals(passwd)) { //如果用户名密码正确
String login = request.getParameter("login");
if("auto".equals(login)) { //如果选择了自动登陆,要
Cookie cookie = new Cookie("user","zhangsan");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);
}
request.setAttribute("user", user);
request.getRequestDispatcher("user.view")
.forward(request, response);
}else { //否则(用户名密码错误)
response.sendRedirect("login.html");
}
}
Index.java:
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
if("user".equals(name) && "zhangsan".equals(value)) {
request.setAttribute(name, value);
request.getRequestDispatcher("/user.view").forward(request, response);
return;
}
}
}
response.sendRedirect("login.html");
}
User.java:
public class User extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
if(request.getAttribute("user") == null) {
response.sendRedirect("login.html");
}
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01" +
" Transitional//EN'>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet User</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>"
+ request.getAttribute("user") + "已登录</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
login.html:
<form action="login.do" method="post">
名称:<input type="text" name="user"><br>
密码:<input type="password" name="passwd"><br>
自动登录:<input type="checkbox" name="login" value="auto"><br>
<input type="submit" value="发送">
</form>