java web:ServletSession/Cookie实现用户状态追踪(自动登录)

会话

同一浏览器向服务器发送的一系列请求。每新建一个会话对象,服务器会为它分配一个sessionid,用来标识请求的发送方。

常用于淘宝购物车,避免A加入购物车的物品放到B购物车去了。

  • 有两种方法实现用户状态追踪,一种是用Session,一种是用cookie。前者是将信息放在服务器,后者是放在客户端。

cookie

cookie是客户端在访问服务器时,服务器留在客户端的一段信息像服务器送给客户端的“小点心”,实质是一段文本。当用户再次访问该服务器时,客户端会将它完整发送给服务器。(如果设置了自动登陆,则会把用户名和密码一起发送至服务器,完成验证自动登录。)

  • 创建
Cookie userCookie=new Cookie(String "cookieName",String "cookieValue"); cookie名称一旦指定不能更改
  • cookie运行过程分4步

①客户端发送请求给服务器
②服务器返回响应并设置cookie到客户端
③客户端再发送请求时将cookie一并发送至服务器
④服务器返回响应。  

  • 将cookie加入响应
  • cookie不安全,因为任何程序都可以读客户端电脑里的所有cookie。
  • cookie成员函数:
Cookie cookie=new Cookie("name", "value");
cookie.getName(); //得到cookie名
cookie.setValue("newValue"); //设置cookie值
cookie.getValue(); //得到cookie值
cookie.getMaxAge(); //得到cookie最大保留时间,单位为s
cookie.setMaxAge(0); //设置cookie最大保留时间,负数不永久保存,0表示删除
response.addCookie(cookie);

ServletSession

Session使用起来更方便(默认要借助cookie,sessionid放在cookie中发送到服务器)。

第一次访问Servlet或jsp是会创建一个Session对象(也可能不),以后客户端再发送请求时,服务器依据sessionid找到该客户对应的Session。每个客户只会获取到自己的Session,每个客户的Session互不影响。

  • 由Request对象获取ServletSession对象
ServletSession session=request.getSession();
  •  把信息(如登录名、密码)保存在Session
session.setAttribute("name",value);

实例:第二次登录时自动登录 

  • 流程:

在浏览器键入:localhost:8080/CheckUserServlet进入CheckUserServlet.java 的doGet方法,第一次登录时cookies为null,所以转到login.jsp页面登录,点提交后由表单的action="CheckUserServlet" method="post",交由CheckUserServlet.java 的doPost方法处理,显示登录成功。

之后再进入localhost:8080/CheckUserServlet,cookies不为空,doGet方法会自动登录。

表单:login.jsp

 <body>
    ${sessionScope.message}<br>
    <form action="CheckUserServlet" method="post">
        请输入用户名和口令:<br>
        用户名:<input type="text" name="username"><br>
        口令:<input type="password" name="password"><br>
     <input type="checkbox" name="check" value="check">自动登录<br>
     <input type="submit" value="提交">
     <input type="reset" name="" value="重置"><br>
     </form>
</body>

CheckUserServlet.java 

import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/CheckUserServlet")
public class CheckUserServlet extends HttpServlet {

	String message =null;

	
	public CheckUserServlet() {
		super();
	}

	
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		String value1="",value2="";
		Cookie cookies[]=request.getCookies();
		if(cookies!=null){
			for(Cookie cookie : cookies){
				if(cookie.getName().equals("username")){
					value1=cookie.getValue();
				}
				if(cookie.getName().equals("password")){
					value2=cookie.getValue();
				}
			}
			if(value1.equals("admin")&&value2.equals("admin")){
				message="欢迎您!"+value1+"再次登录!";
				request.getSession().setAttribute("mwssage", message);		
				response.sendRedirect("index.jsp");
			}else {
				response.sendRedirect("login.jsp");
			}
		}else {//cookies为空,表示这是第一次登录
			response.sendRedirect("login.jsp");
		}
		
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		if(!username.equals("admin")||!password.equals("admin")){
			message="用户名或口令输入不正确,请重输!";
			request.getSession().setAttribute("message", message);
			response.sendRedirect("login.jsp");
		}else {
			if(request.getParameter("check")!=null && request.getParameter("check").equals("chack")){
				Cookie nameCookie=new Cookie("username", username);
				Cookie passCookie=new Cookie("username", username);
				nameCookie.setMaxAge(60*60);
				passCookie.setMaxAge(60*60);
				response.addCookie(nameCookie);
				response.addCookie(passCookie);
			}
			message="您已成功登陆!";
			request.getSession().setAttribute("message", message);
			response.sendRedirect("index.jsp");
		}
	}

	public void init() throws ServletException {
		// Put your code here
	}

}

猜你喜欢

转载自blog.csdn.net/wangqianqianya/article/details/88983650