gxdao
v1.1.4
Published
use j2ee and DAO to CRUD from mysql,introduce session
Downloads
41
Maintainers
Readme
主要结构: gxdao/JavaEE gxdao/JavaEE/JDBC/j2ee/web gxdao/javaEE/session 说明
一、主要示例:借助 DAO 的思想,利用 Tomcat 和 Servlet 实现 Mysql 的 CRUD 操作+前端 Html 利用 JSP 演示 Session、Cookie 的机制。 1.1.2 版本新增了,hero 表界面的 用户登录+注册功能,采用 MVC 思想构建的新版本的 JDBC 源码,位于 JDBC 1.0.1-登录功能-独立Tomcat80端口 文件夹中,详细配准内容见该文件夹内的README说明文件。 1.1.3 版本在1.1.2版本的基础上,基于 filter 的思想 增加了 验证码功能,错误次数过多将需要输入验证码,登录错误次数过多将被限制访问。 1.1.4 版本在1.1.3版本的基础上,使用 基于 Listener 的监听方法,用于统计在线人数,并实现重复登录拦截的功能。 主要说明: 前端:addHero.html、editHero.html
后端:HeroSevlet(查询主表)、AddHeroServlet、DeleteHeroServlet、EditHeroServlet、UpdateServlet、HeroDAO
简化代码,避免频繁请求连接 connection,避免冗长的 声明 PreparedStatement 以及冗长的设置参数的代码。 使用一个 query 方法 封装所有的 CRUD 操作,以提高代码复用率。 由于 反射机制 学的不是很深入,就采用了较为简单的判断方法来设置参数。
具体如下: 使用懒汉单例模式构建 HeroDAO 类,因为我觉得不应该提供多个 Connection , 毕竟暂时还未考虑多线程和并发,既避免 多个 Connection 容易形成的错误, 又减轻了访问数据库的压力和资源占用,还可以复用同一个 Connection。
query 方法 用于访问数据库,需要提供字符串参数 sql 语句,可选择的 Object 参数。 采用 PreparedStatement ,并结合 try-with-resource 的方法,调用完就关闭资源。 但是,Connection 不能使用 try-with-catch ,因为后续 DAO 都复用这个唯一连接。
所有的 PreparedStatement 的参数设置都封装在一个方法内, 通过 query ( String sql,Object...params ) 来通用所有的参数类型, 根据 sql语句与指定的参数,访问数据库并执行增删改查操作。 * @param sql 为数据操作所执行的 sql 语句 * @param objs 参数,如果为 Hero 对象,则默认设置 Hero 除 id 以外的所有属性, * 可以另外提供 hero.id 参数作为输入, * 如果为基本数据则设置相应的参数,类型:Integer、Float,其他皆按照 Double设置 * 如果为String对象,则设置字符串参数。 * 不提供参数,则不进行设置,直接执行 sql 语句。 * @return 如果为查询操作,则以 LinkList 形式返回查询结果,否则返回 null
二、使用步骤:
0.安装 mysql 客户端 和 服务端,并设置 用户名为 root,密码为 admin,
数据库名为 how2java ,表名 :hero ,端口为:3306。可向其中添加一些信息。
0.1 mysql 数据库 配置教程:https://how2j.cn/k/mysql/mysql-install/377.html
0.2 mysql 创建表教程与代码:https://how2j.cn/k/servlet/servlet-query/563.html
CREATE TABLE hero
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
varchar(30) DEFAULT NULL,
hp
float DEFAULT NULL,
damage
int(11) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
1.需要使用 Eclipse 导入 dynamic 动态 web 项目, 导入教程:https://how2j.cn/k/servlet/servlet-import/1371.html
2.通过Eclipse启动Tomcat-服务器选择Tomcat v7.0 Server,然后指定Tomcat目录所在位置, 选择 Tomcat7-8080-eclipse 文件夹所在位置。 配置 Tomcat 见教程:https://how2j.cn/k/servlet/servlet-dynamic-web-project/1306.html
3.在浏览器 输入 http://127.0.0.1:8080/j2ee/hero 即可浏览项目示例。
4.如果启动失败,请检查80端口是否被占用,关闭即可。 见教程:https://how2j.cn/k/tomcat/tomcat-portfix/545.html
详见:https://how2j.cn/k/jsp/jsp-session/583.html,@虚心求学 的回答 我认为 session 存的东西重要性和安全性 > Cookie,因为两者存放的位置不一样。
Cookie 字如其名:曲奇饼干,你吃掉一口,但是自己还留了一大块,可以理解为 用户本地存东西的方式,
而服务器可以理解为 零食店, Sesssion 则可以理解为 零食店(服务器) 的货架, 是服务器存储用户信息的容器。
Cookie 和 Session 的关系,以及 用户获取 session 的过程可以这么理解:
你吃了一口 cookie ,发现蛮不错的,吃完了想去超市买(从服务器拿东西), 商店的货架上,有各式各样的牌子,你吃的是哪个牌子的?找不到, 是不是得问超市店员,拿着你的 Cookie 给他看,他一个一个地比对,后来店员发现 咦!这个曲奇商品和你的曲奇饼干长得一模一样(id匹配),于是就拿出来给了你(当然要付钱)。。。
这个过程,就是服务器根据 Cookie 中留存的 id 信息, 找到对应的 session,返回给用户。
当你第一次访问服务器,并没有 session_id 信息,服务器会自动给你分配一个,并保存到用户本地。 相当于:你第一次去零食店,你手上没有饼干,店员拿了新品给你免费品尝(分配session id), 于是你开开心的拿了一个饼干回家,相当于 将 session_id 存到了本地的 Cookie 中,这个session_id, 就是 饼干的牌子,也就是 服务器 session 的唯一标识符,根据这个id可以找到用户的session。
当你第二次访问服务器,手上已经有了一个 session_id(本地Cookie中存在),服务器就不会再给你 分配 session key 了,而是根据你的 session Id 找到对应的 session 返回给你。 相当于,你下次、下下次去零食店,你手上已经有了饼干,店员想了想 你这小子又想白嫖!不会再给你 发免费饼干了。你赶紧解释说:误会了,我是来买东西的,于是你给店员看了你手上饼干的牌子(session_id), 让他根据这个牌子,找到货架拿出你要买的东西卖给你。
自然,饼干有保质期,商店货架上的东西也有保质期。也就是,Cookie 、 session 都有期限, 过期了自然就失效了。
会话是指客户端和服务器之间的一系列交互过程,从用户访问网站开始直到关闭浏览器。而 Cookie 是存储在用户计算机上的小型文本文件,用于跟踪和标识用户。
在服务器第一次分配 sessionid 时,服务器会生成一个唯一的 session 标识符,并将其发送给客户端。客户端接收到 sessionid 后,将其存储在本地的 Cookie 中。从本地获取 sessionid 到服务器后,服务器会尝试使用该 sessionid 找到对应的会话信息,并恢复用户之前保存的状态。随后,在用户第二次访问时,浏览器将包含该 sessionid 的 Cookie 发送给服务器以表明自己身份,并且服务端找到相应的 session 信息为用户提供持续性服务。
截图是整个过程,模拟 session id 的分配、session id 到 Cookie d的存储,session 的 获取,session 的加解密。 session_id 始终是对用户隐藏的,存放在session中,而 session_id 加密后的 session_key 是可以短暂的存留在 Cookie 中。 为了直观地模拟 session 创建、获取过程,选择自定义一个新的 session id,命名为 session_id,出于安全考虑, 一般会对这个 id 进行加密,而不是直接把 id 传输给用户。为了模拟加密的过程,我选择 进制转换 的方式以及伪码的方式加解密, 当然实际的加密方式更复杂,我只是简单地模拟。每一个过程,session_id 都是对用户隐藏的,仅 通过session_key 通讯。
模拟过程主要包括:
setSession:用户第一次访问服务器,没有存储 id ,系统自动分配一个session Id, 并通过加密的方式,返回给 用户 session_key(对 id 的加密)。
setCookie:将上一个过程分配的 session_key 保存在用户本地的 Cookie 中。
getCookie:尝试拿出 Cookie 中的 session_key,目的是为了下一步去服务器比较 session 的id。
4.getSession:由于步骤3 已经拿到了 session_key,因此可以尝试从服务器拿出 session, 服务器 接收到用户端传来的 session_key,对其解密为 session_id ,尝试比较 各个session属性的 id,如果匹配,则返回对应的sesstion 值,获取成功。反之,返回错误信息,获取失败。
5.当用户第二次访问服务器,此时已经存在 session_key (位于 Cookie中) ,因此不再继续分配 id, 而是直接 到 获取 Cookie 步骤,也就是到步骤3,无需setCookie。
6.当 session_key 过期,或者 session 会话过期,或者尝试通过错误的key来访问session, 服务器对其拦截,并返回 获取失败信息。
以上的过程,都对应者jsp文件,分别为:setSession -> setCookie -> getCookie -> getSession 详见代码,每个部分编辑为独立的jsp文件,然后放在 web 目录下,启动自己的 Tomcat,或者在 Eclipse 启动8080Tomcat, 如果是我文件夹中的Tomcat, 浏览器 首先访问 http://127.0.0.1:8080/j2ee/setSession.jsp 即可
以上是我的拙见,恳请各位批评指正。