Session

Session简介

  • Session表示会话,不止在javaweb中存在,只要是web开发,都会存在Session会话。
  • Cookie将会话状态保存在客户端,Session将会话状态保存在服务器端。
  • HttpSession是一个会话级别对象,一次会话对应一个HttpSession对象。
  • 在web容器中,web容器维护了大量的HttpSession对象,换句话说,在web容器中有一个“Session”列表。
       //获取当前session,获取不到,则新建
        HttpSession session = request.getSession();
        //获取当前session,获取不到,则新建
        HttpSession session = request.getSession(true);
        //获取当前session,获取不到,返回null
        HttpSession session = request.getSession(false);

Session实现原理

  • 打开浏览器,在浏览器上发送首个请求。
  • 服务器会创建一个HttpSession对象,该对象表示一个会话。
  • 同时生成HttpSession对象对应的Cookie对象,并且该Cookie对象的name是JSessionID,Cookie的value是32位的字符串。
  • 服务器将Cookie的value和HttpSession对象绑定到Session列表。
  • 服务器将Cookie发送浏览器缓存中,浏览器不关闭,Cookie不会消失。
  • 当再次请求时,会自动提交缓存中的Cookie.
  • 服务器接收到Cookie,验证Cookie的name是否是JSessionID,获取对应value.
  • 通过Cookie的value去Session列表找对应的HttpSession对象。

这里写图片描述


Cookie禁用Session跟踪

  • 重定向时跟踪
    这里写图片描述

  • 非重定向时跟踪
    这里写图片描述
    注意:这样做到导致SessionID暴露到地址栏,更加不安全,一般建议不禁用cookie,若禁用cookie,则无法访问该网址。


浏览器关闭,Session对象被销毁吗?

  • 浏览器关闭,不会销毁session对象。
  • 因为B/S系统基于HTTP协议,HTTP协议是样子无连接/无状态协议。
  • 因为请求瞬间浏览器和服务器通道打开,响应结束后,通道关闭。
  • 为了减轻服务器压力。

Session对象什么时候销毁

  • web系统引入session超时。
  • 当很长时间(一段时间)没有用户访问该session对象,此时session对象超时,web服务器自动回收session对象。
  • 可配置:在web.xml默认30分钟
    <session-config>
        <!--120分钟-->
        <session-timeout>120</session-timeout>
    </session-config>
  • 在代码中设置(优先级高于web.xml)
session.setMaxInactiveInterval(30*60);//以秒为单位

会话定义

  • 一般情况下:用户打开浏览器,进行一系列操作,然后将浏览器关闭,表示一次会话结束。
  • 本质描述:从session对象创建,到session销毁,才是真正意义一次会话。

HttpSession对象常用接口

  • Object getAttribute(String var1);
  • void setAttribute(String var1, Object var2);
  • void removeAttribute(String var1);
  • void invalidate(); ————-session销毁
  • session.setMaxInactiveInterval(30*60);//以秒为单位

ServletContext HttpSession HttpServletRequest接口

  • ServletContext Application:应用范围;完成跨会话共享数据。

  • HttpSessionHttp session:会话范围;完成跨请求共享数据,请求在同一个会话中。

  • HttpServletRequest request:请求范围;完成跨Servlet共享数据,这些Servlet在同一个请求(转发)。


模拟拦截登陆(无实际用途,仅仅为了理解session)

功能:登陆后跳到success.jsp页面,点击“是否登陆成功”,若已登陆,显示登陆成功,若没有登陆跳到success.jsp页面,点击“是否登陆成功”,则返回登陆页面index.jsp。

  • 登陆页面,index.jsp
        <form action="/servlet/a" method="get">
          姓名<input type="text" name = "name"> <br>
          密码<input type="password" name = "password"><br>
              <input type="submit" value="登陆">
        </form>
  • 验证登陆名,密码,Indexservlet.java
@WebServlet(value ="/a")
public class Indexservlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取页面传来的值
        String name = request.getParameter("name");
        String password = request.getParameter("password");

        //验证账号密码
        if ("admin".equals(name) && "123456".equals(password)) {
            //获取当前session,获取不到,则新建
            HttpSession session = request.getSession();
            session.setAttribute("name",name);
            session.setAttribute("password",password);
            //跳转成功页面
            response.sendRedirect(request.getContextPath()+"/success.jsp");
        } else {
            //跳转失败页面
            response.sendRedirect(request.getContextPath()+"/error.jsp");
        }

    }
}
  • 成功页面,success.jsp
 登陆成功<br>
    <a href="/servlet/b">是否登陆</a>
  • 验证是否登陆,Welcomeservlet.java
@WebServlet(value ="/b")
public class Welcomeservlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        //获取当前session,获取不到,返回null
        HttpSession session = request.getSession(false);
        //验证是否登陆,通过name,password是否有值判断
        if (session != null && session.getAttribute("name") !=null && session.getAttribute("password")!=null) {
            //已经登陆
            out.print("已经登陆了");
            out.print(session.getAttribute("name"));
            out.print(session.getAttribute("password"));
        } else {
            //未登陆,跳转到登陆页面
            response.sendRedirect(request.getContextPath()+"/index.jsp");
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值