使用session记住用户登录信息

时间:2024-04-09 10:21:34

使用session记住用户登录信息


什么是session ?

也叫会话对象,是存储在服务器端用来识别用户的时域,用来记住用户的访问信息,这样用户下次访问时就能识别。

怎么使用session ?

通过HttpServletRequest对象获取

public class SessionServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter pw = resp.getWriter();
		// 从请求对象中获取session,如果没有则创建session
		HttpSession isession = req.getSession();
	
	}
}

作用

1.识别用户
2.存储信息

1.识别用户:

服务器创建session,产生sessionID,当用户访问时sessionID会保存在客户端cookie中
使用session记住用户登录信息

用户下次访问时就会带着sessionID,服务器就会找到对应的session,这样就可以识别用户了。

2.存储信息:

session也是域对象可以存储一些信息,交给服务器处理。
方法:

		//从请求对象中获取session,如果没有则创建session
		HttpSession isession = req.getSession();
		
		isession.setAttribute("username", "zhangsan");
		isession.setAttribute("password", "123");
		isession.setMaxInactiveInterval(60);//设置超时时间

例题

编写一个Servlet使用Session如下功能

  1. 当用户第一次访问时,显示:你好,游客。
  2. 提供一个文本框和按钮 让用户填用户 登录,登录也是提交到给本Servlet处理,登录后 页面显示 你好,xxxx.
  3. (不关闭浏览器)1分钟内刷新页面,显示 你好,xxxx.
  4. (不关闭浏览器)1分钟后刷新页面,显示:你好,游客。
package session_test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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

@WebServlet("/session")
public class SessionServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter pw = resp.getWriter();
		// 从请求对象中获取session,如果没有则创建session
		HttpSession isession = req.getSession();
		// 获取用户提交的数据
		String name = req.getParameter("username");
		String password = req.getParameter("password");
		
		
		

		pw.println("<!DOCTYPE html>                                                    ");
		pw.println("<html>                                                             ");
		pw.println("<head>                                                             ");
		pw.println("<meta charset=\"UTF-8\">                                             ");
		pw.println("<title>Insert title here</title>                                   ");
		pw.println("</head>                                                            ");
		pw.println("<body>                                                             ");
		pw.println("<form action=\"session\" method=\"get\">                                 ");
		pw.println("用户名:<input type=\"text\" name=\"username\" /><br />    ");
		pw.println("密码:<input type=\"password\" name=\"password\" /><br />  ");

	                                                      
		pw.println("<br /><input type=\"submit\" value=\"登录\" />                              ");
		pw.println("</form>                                                            ");
		pw.println("                                                                   ");

		//判断session是不是新创建的
		if (isession.isNew()) {
			pw.println("你好,游客");
		
		} else {
			//服务器已存在该session
			//把用户输入放入session,用来比对用户下次输入信息
			
			//判断session中是否已经有内容,如果有就不在存入,这样只能使用第一次记录的账号密码登陆,没有使用数据库
			if(isession.getAttribute("username")==null&&isession.getAttribute("password")==null) {
				System.out.println("存入账号密码");
				
				isession.setAttribute("username", name);
				isession.setAttribute("password", password);
				isession.setMaxInactiveInterval(60);
			}else {
				System.out.println("namegetAttribute"+isession.getAttribute("username"));
				System.out.println("namegetValue"+isession.getValue("username"));
			}
			
		
			//获取session中的账号和密码
			String cusername = (String) isession.getAttribute("username");
			String cpassword = (String) isession.getAttribute("password");
			
			System.out.println("获取session中的账号和密码");
			System.out.println(cusername);
			System.out.println(cpassword);
			System.out.println(isession.getId());
			if(name.equals(cusername)&&password.equals(cpassword)) {
				pw.println("你好,"+cusername);
			}
			
			
		}
		
		
		pw.println("</body>                                                            ");
		pw.println("</html>       ");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}


运行结果

用户第一次访问:
使用session记住用户登录信息

cookie存储了sessionID:
使用session记住用户登录信息

输入账号密码再次登录
使用session记住用户登录信息

sessionID在超时时间内不会改变
使用session记住用户登录信息

用户输入其他账号密码,不能登录,因为session里已经有了账号和密码(“zhangsan”,“123”)


注意

session对象的getAttribute(“字段”)和getValue(“字段”)作用相同都是获取字段的值。getValue(“字段”)已经过时了,所以不建议使用。


生命周期

  • 创建:第一次执行request.getSession()时创建
  • 销毁:
    • 服务器(非正常)关闭时
    • session过期/失效(默认30分钟)

设置时间:
代码设置

session.setMaxInactiveInterval(60);

问题:时间的起算点 从何时开始计算30分钟?
从不操作服务器端的资源开始计时

可以在工程的web.xml中进行配置

<session-config>
        <session-timeout>30</session-timeout>
</session-config>
  • 手动销毁session
    session.invalidate();
    服务器关闭

作用范围:

默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象


Session技术
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID