使用session记住用户登录信息

简介: 使用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如下功能

  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);
  }
}

运行结果

用户第一次访问:

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


目录
相关文章
ThreadLocal实现登录(保存用户登录信息)
ThreadLocal可以将用户信息保存在线程中,当请求结束后我们在把保存的信息清除掉。这样我们才开发的时候就可以直接从全局的ThreadLocal中很方便的获取用户信息。 使用ThreadLocal,可以在同一线程中很方便的获取用户信息,不需要频繁的传递session对象。
2341 1
ThreadLocal实现登录(保存用户登录信息)
|
1月前
|
存储
登录界面的验证登录以及session的使用
构建登录系统,login.jsp接收用户输入,POST数据到check.jsp验证。正确时在session中存储用户名并重定向至admin.jsp,该页检查session中的username,存在则显示管理员界面,否则返回login.jsp。session非一一对应用户浏览器,且在check.jsp中设置session超时为60秒。实验包括流程图及不同登录状态的界面展示。
32 1
|
1月前
|
存储 前端开发
通过session实现用户的登录与登出功能
通过session实现用户的登录与登出功能
102 0
|
1月前
|
存储 前端开发 Java
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
91 0
|
druid Java 关系型数据库
试图用Session Administration删除某用户的session时报错
试图用Session Administration删除某用户的session时报错
试图用Session Administration删除某用户的session时报错
|
JavaScript 前端开发 中间件