文章目录

  • 实现登录功能
  • 会话机制(session)
    • 会话实现原理
    • Cookie
  • session会话的常用方法
  • 改造登录功能

实现登录功能

  • 步骤1:数据库当中添加一个用户表:t_user

    t_user表当中存储的是用户的登录信息,最基本的也包括:登录的用户名和登录的密码。
    密码一般在数据库表当中存储的是密文。一般不以明文的形式存储。(这里先使用明文方式。)

  • 步骤2:再实现一个登录页面。

    登录页面上应该有一个登录的表单。有用户名和密码输入的框。
    用户点击登录,提交表单,提交用户名和密码。form是post方式提交。

  • 步骤3:后台要有一个对应的Servlet来处理登录的请求。

    登录成功:跳转到登录成功页面。
    登录失败:跳转到失败的页面。

index.jsp页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>欢迎登录</title></head><body><h1>用户登录</h1><hr><form action="<%=request.getContextPath()%>/user/login" method="post">username:<input type="text" name="username"><br>password:<input type="password" name="password"><br><input type="submit" value="login"></form></body>
</html>

UserServlet

@WebServlet("/user/login")
public class UserServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {boolean success = false;String username = request.getParameter("username");String password = request.getParameter("password");Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = DButil.getConnection();String sql = "select * from t_user where loginName=? and loginPwd=?";ps = conn.prepareStatement(sql);ps.setString(1,username);ps.setString(2,password);rs = ps.executeQuery();if (rs.next()) {success = true;}} catch (SQLException e) {e.printStackTrace();}finally {DButil.close(conn,ps,rs);}if (success) {response.sendRedirect(""+request.getContextPath()+"/success.html");//跳成功页面}else{response.sendRedirect(""+request.getContextPath()+"/fail.html");//跳失败页面}}
}

DButil数据库工具类

登录功能实现了,目前存在的最大的问题:
如果在后面有一些登录后才能操作的功能,在浏览器地址栏输入http://localhost:8080/项目名/路径,只要知道路径就可以直接不用登录进行操作。
这个登录功能目前只是一个摆设,没有任何作用。只要用户知道后端的请求路径,照样可以在不登录的情况下访问。

为什么?
发现代码中登录只是一种请求,而request的生命周期很短,一次请求一个对象。
HttpServletRequest接口详解
如果用ServletContext保存的话,生命周期又很长,服务器启动时创建,关闭是销毁。
ServletContext应用域详解

会话机制(session)

在HttpServletReauest有一个获取会话的对象方法

     public HttpSession getSession();

然后编写代码打印输出到浏览器

     HttpSession session = request.getSession();response.setContentType("text/html,charset=UTF-8");PrintWriter out = response.getWriter();out.print(session);

发现只要不关闭浏览器,无论打开多少个窗口,都会输出同一个对象,只要重新打开浏览器重新访问,输出的对象就不是同一个。

会话机制(session):用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这个整个过程叫做:一次会话。java对象叫做:session。

  1. session对象是存储在服务端的
  2. 一个session对象对应一个会话
  3. 一次会话包含多次请求

在java的servlet规范当中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession),session机制属于B/S结构的一部分。

为什么需要session对象来保存会话状态呢?
因为HTTP协议是一种无状态协议(请求的时候,B和S是连接的,但是请求结束之后,连接就断了。)。

会话实现原理

有这样一个问题,服务器有很多个session,那怎么保证,用户获取到的是同一个对象,不会获取到另一个用户的session呢?

在web服务器有一个session列表,类似于Map集合
Map集合key存储的是session的id,value存储的是对应的session对象

  • 当用户发送第一次请求的时候:服务器会创建一个新的session对象,同时给它生成一个id,然后会将这个id发给浏览器,浏览器会把这个id保存在浏览器缓存中。
  • 当用户发送第二次请求的时候:会自动将浏览器缓存中的session的id自动发送服务器,然后服务器根据id就会从session列表中查找对应的session对象。
  • 当用户关闭浏览器之后,这个保存的缓存id就消失了,下次重新打开浏览器的之后,服务器自然就找不到session对象,等同于会话结束。
  • 当用户关闭浏览器,会话结束,但是服务器里之前的session对象还存在,这时候会有个超时机制,当长时间未操作的时候,会自动销毁session对象。
  • 当用户重新打开浏览器时,再次访问,就会生成新的session

超时时长可以在web.xml文件配置,例如配置60分钟
默认时长可以在服务器的web.xml查看

 <session-config><session-timeout>60</session-timeout></session-config>

Cookie

还是上面的代码进行测试,打开浏览器,按F12,查看第一次访问

发现第一次访问,会响应一个Set-Cookie:JSESSIONID=XXX过来,点击刷新,再次发送请求

查看请求,发现会发送一个Cookie:JSESSIONID=XXX过去,且内容与第一次响应过来的一样。
所以JSESSIONID是以Cookie的形式保存在浏览器里面,浏览器只要关闭。这个Cookie就没有了。

Cookie禁用了,session还能找到吗?

  • 服务器正常发送cookie给浏览器,但是浏览器拒收了。并不是服务器不发了。
  • 找不到了。每一次请求都会获取到新的session对象。
  • cookie禁用了,session机制还能实现吗?
    • 可以。需要使用URL重写机制。
    • http://localhost:8080/项目名/路径;jsessionid=XXX
    • URL重写机制会提高开发者的成本。开发人员在编写任何请求路径的时候,后面都要添加一个sessionid,给开发带来了很大的难度,很大的成本。

session会话的常用方法

Object getAttribute​(String name)//返回在此会话中绑定了指定名称的对象,或者如果该名称下没有绑定任何对象,则返回该对象null
void setAttribute​(String name, Object value)//使用指定的名称将对象绑定到此会话。
void removeAttribute​(String name)//从此会话中删除绑定了指定名称的对象。
void invalidate()//结束会话,然后取消绑定到它的任何对象。

改造登录功能

UserServlet

@WebServlet("/user/login")
public class UserServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {boolean success = false;String username = request.getParameter("username");String password = request.getParameter("password");Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = DButil.getConnection();String sql = "select * from t_user where loginName=? and loginPwd=?";ps = conn.prepareStatement(sql);ps.setString(1,username);ps.setString(2,password);rs = ps.executeQuery();if (rs.next()) {success = true;}} catch (SQLException e) {e.printStackTrace();}finally {DButil.close(conn,ps,rs);}if (success) {HttpSession session = request.getSession();//获取session,必须获取到session.setAttribute("username",username);//把用户名存进去response.sendRedirect(""+request.getContextPath()+"/user/success");//跳到另一个servlet进行处理}else{response.sendRedirect(""+request.getContextPath()+"/fail.html");}}
}

UserLoginServlet

public class UserLoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession(false);if (session != null && session.getAttribute("username") != null) {//获取到,可以在里面写功能,这里直接就跳到登录成功页面response.sendRedirect(request.getContextPath()+"/success.html");}else {response.sendRedirect(request.getContextPath());//重新跳到登录页面}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

登录成功之后,可以将用户的登录信息存储到session当中。也就是说session中如果有用户的信息就代表用户登录成功了。session中没有用户信息,表示用户没有登录过。则跳转到登录页面。

会话机制(session)相关推荐

  1. PHP中session特点及用途,PHP特点之会话机制2——Session及其使用

    会话机制(Session)在 PHP 中用于保存并发访问中的一些数据.这使可以帮助创建更为人性化的程序,增加站点的吸引力. 一个访问者访问你的 web 网站将被分配一个唯一的 id, 就是所谓的会话 ...

  2. 深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现...

    1.session的注意点: @session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] s ...

  3. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  4. 关于BS结构系统的会话机制(session机制)

    关于B/S结构系统的会话机制(session机制) 会话 用户打开浏览器,进行一系列操作,最终关闭浏览器,这个整个过程叫做:一次会话(对应的java对象是session) 一次请求:用户在浏览器上面点 ...

  5. 从实例入手学习Shiro的会话机制

    场景 从实例入手学习Shiro与Web的整合: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/90140802 在上面已经实现整合 ...

  6. WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务

    原文:WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务 在<基于IIS的WCF服务寄宿(Hosting)实现揭秘>中,我们谈到在采用基于IIS(或者 ...

  7. 巨杉内核笔记(一)| SequoiaDB 会话(session)简介

    SequoiaDB 会话(session)简介 会话(Session)的基本概念 容易弄混淆的两个概念是会话与连接. 通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文( ...

  8. 33、JAVA_WEB开发基础之会话机制

    会话是什么 一个客户端浏览器与web服务器之间连续发生的一系列请求和响应过程就是会话,这些过程中产生的一系列信息就是会话信息,会话机制就是用于维护这些信息一致性的一种技术.通俗的说就是,一个A账号访问 ...

  9. 使用HTML5 WebStorage API构建与.NET对应的会话机制

    HTML5的Web Storage API,我们也称为DOMStarage API,用于在Web请求之间持久化数据.在Web Starage API 出现之前,我们都是将客户端和服务端之间的交互数据存 ...

最新文章

  1. List Tuple Dictionary 区别
  2. 【今日互联网大事儿】传百度要投资Uber呢~
  3. Linux C/C++多线程pthread实例
  4. 本科生一作发10篇SCI,我们硕博生情何以堪啊……
  5. IDEA部署Tomcat
  6. python切片表达式3个参数_Python:Base3(函数,切片,迭代,列表生成式)
  7. 写在自己工作六年:转载《软件工程师六年心得体会》
  8. 计算机设备如何巡检,计算机机房巡检管理制度
  9. CryptoJS与C#AES加解密互转
  10. 【ArcGIS风暴】ArcGIS支持的栅格数据格式大全及格式转换案例精解
  11. debug这个词真的源自小虫子
  12. 程序设计思维与实践 Week15 作业 A-ZJM与霍格沃兹
  13. 基于SqlServer的DML(数据查询)实验,掌握select查询语句的使用、掌握有无条件查询、结果排序与分组、掌握视图用法
  14. efm32芯片电压_谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)
  15. python 图像识别实现四川麻将回放牌面数据
  16. vue精通之路:掌握这42个Vue知识点,你将成为大shen
  17. storm spout读取mysql_Storm中Spout使用注意事项小结
  18. 即将到来的风暴 ― SDN/NFV探讨
  19. 如何在安卓手机上查看airpods pro的电量
  20. Apple Watch API的功能

热门文章

  1. 第一章 README
  2. c语言定义max和命令,C语言#define定义函数
  3. SpringBoot2.0整合多数据源拆分
  4. 有效提高执行力,你需要这几个技巧
  5. DataGrid 数据绑定使用小结三(数据绑定)
  6. (通俗版)手机漫游的实现原理
  7. python 10进制转2进制
  8. 华为nova8pro和小米11哪个好
  9. 女性视角有利于人工智能平衡发展
  10. HyperLedger Cello的部署操作