JSP九大内置对象之session以及eclispe如何关联源码

一、session的特点及其实例

session:同一次会话共享
 a.浏览网站:开始->关闭
 b.购物:浏览、付款、退出
 c.电子邮件:浏览、写邮件、退出
  从一次开始到一次结束,是一次会话。
  客户端第一次访问服务器时:(因为不存在Cookie的JSESSIONID,无法匹配成功,所以分配)
  客户通过浏览器访问服务器,服务端产生一个session来接待他,产生的session自带一个sessionID(通过sessionID来区分不同的session),服务端会将产生的sessionID复制一份,即JSESSIONID,服务端会将JSESSIONID包含在Cookie中发送给服务器。(服务端和客户端通过Cookie和session对应起来,两者的连接者是通过JSESSIONID和sessionID相同的原理来匹配,实现一一对应)
  客户端第二/n次访问时,直接对客户端已有的Cookie中的JSESSIONID和服务端的session中的sessionID进行匹配,如果匹配成功(JSESSIONID和sessionid相同),说明不是第一次访问,无需登录,实现一一对应。

  类似于商城的存包处
  客户端:顾客;
  服务端:商场存包处;
  顾客第一次存包:先判断有没有钥匙(JSESSIONID),没有,就分配一个。
  顾客第二次存包:判断有没有钥匙(JSESSIONID),有,就进行匹配,找到对应的箱子(session).

  session特点:
  a.session存储在服务端。
  b.session是在同一个客户请求时共享。
  c.session实现机制:第一次用户请求时产生sessionID,并复制给Cookie的JSESSIONID,然后发送给客户端。

  session方法:
  String getID():获取sessionID
  boolean isNew():判断是否是新用户(第一次访问)。
  void invalidate():使session失效(退出登录、注销)。
  //失效只失效当前session

  void getAttribute()
  Object setAttribute()

  void setMaxInactiveInterval():设置最大有效非活动时间
  //如设该时间为30分钟,就是当你从此处离开一段时间,如在30分钟内,可以直接继续操作,如超过30分钟,则需要重新登录。
  int getMaxInactiveInterval():获取当前最大有效非活动时间
 
  浏览器的session共享

实例

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

  <form action="check.jsp" method="post">
         用户名<input type="text" name="uname" > <br/> 
         密码<input type="password" name="upwd"> <br/>
         <input type="submit" value="登录"> <br/>
  </form>
</body>
</html>

check.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
      <%
          //设置编码
          request.setCharacterEncoding("utf-8");
          //获取用户名和密码
          String name=request.getParameter("uname");
          String pwd=request.getParameter("upwd");
          //进行检验,此处未使用数据库,以此替代
          if(name.equals("张志伟")&&pwd.equals("123456"))//假设用户及密码
          {
              //如果登录成功,获取两个session
              session.setAttribute("uname", name);
              session.setAttribute("upwd", pwd);
              
              //将sessionID打印到控制台
              System.out.println("sessionID"+session.getId());
              //设置最大非活动有效时间为50秒
              session.setMaxInactiveInterval(50);
              
              Cookie cookie= new Cookie("uname",name);
              response.addCookie(cookie);
              
              request.getRequestDispatcher("welcome.jsp").forward(request, response);
          }
          else
          {//登陆失败
              response.sendRedirect("login.jsp");
          }
       %>
</body>
</html>

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     欢迎您:
     <%
          String name = (String)session.getAttribute("uname");
          //如果客户没有登录,直接通过地址访问,获取的name值为null,就让它返回登录界面去登陆
          if(name!=null)
          {
              out.print(name);
              
     %>
     
     <a href="invalidate.jsp">注销</a>
     <% 
          }
          else
          {
              request.getRequestDispatcher("login.jsp");
          }
     %>
</body>
</html>

invalidate.jsp此页面是注销页面,负责使session失效

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
        <%
           //删除全部session
           session.invalidate();
        
           //重定向到登录页面
           response.sendRedirect("login.jsp");
           //删除指定的部分
           //session.removeAttribute("uname");
        %>
</body>
</html>

a.jsp此页面的存在是为了检查session是否失效成功,并检验sessionID和JSESSIONID是否匹配成功。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <%
        out.print( session.getAttribute("uname"));
     
        Cookie []cookies=request.getCookies();
        for(Cookie cookie:cookies)
        {
            if(cookie.getName().equals("JSESSIONID"))
            {
                System.out.println(cookie.getValue());
            }
        }
     %>
</body>
</html>

下面是测试截图

 

 

 点击登录,经过check.jsp的校验,跳转至welcome.jsp

此时的a.jap显示了通过session获取的name

 

控制台中输出了sessionID和cookie.getValue(),

前者说明登录成功,后者说明sessionID和JSESSIONID成功匹配

 

 

 

 

 

 

在点击注销后,name为null,说明使session失效成功

 

 

 

 

 

cookie和session的区别
                        cookie                         session
  保存的位置             客户端                          服务端
  安全性                 较不安全                        较安全
  保存的内容             String                          Object

 

此处不注意会报错。

session的返回对象value是Object类型

 

 cookie的保存是String类型

 

 

三、如何使eclispe关联源代码

首先按住Ctrl,将鼠标移动至要关联的类,如Cookie,Cookie下会出现一条蓝线,单击它。

 

 到Tomcat官网去下载配套源码包(请参照之前的博客)

http://tomcat.apache.org/

 

 下载Source Code Distributions中的zip,建议将这些安装包放到一起,便于寻找

 

 点击后进行关联,找到刚才下载的zip源码包

 

点击OK即可,再次按住Ctrl点击Cookie,即可查看源代码

 

 Ctrl+O

查看

Ctrl+shift+T:查找session的源码

posted @ 2020-01-15 16:02  夜月薇凉映银弩  阅读(319)  评论(0编辑  收藏  举报