使用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中
用户下次访问时就会带着sessionID,服务器就会找到对应的session,这样就可以识别用户了。
2.存储信息:
session也是域对象可以存储一些信息,交给服务器处理。
方法:
//从请求对象中获取session,如果没有则创建session
HttpSession isession = req.getSession();
isession.setAttribute("username", "zhangsan");
isession.setAttribute("password", "123");
isession.setMaxInactiveInterval(60);//设置超时时间
例题
编写一个Servlet使用Session如下功能
- 当用户第一次访问时,显示:你好,游客。
- 提供一个文本框和按钮 让用户填用户 登录,登录也是提交到给本Servlet处理,登录后 页面显示 你好,xxxx.
- (不关闭浏览器)1分钟内刷新页面,显示 你好,xxxx.
- (不关闭浏览器)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);
}
}
运行结果
用户第一次访问:
cookie存储了sessionID:
输入账号密码再次登录
sessionID在超时时间内不会改变
用户输入其他账号密码,不能登录,因为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