cgb2107-day06 淡淡的烟草味﹌ 2021-09-11 03:34 270阅读 0赞 ### 文章目录 ### * * 一,作业 * * \--1,需求: 模拟用户登录现象 * \--2,测试 * \--3,标准的释放资源 * \--4,改造释放资源 * 二,HTML * * \--1,概述 * \--2,入门案例 * \--3,练习 * 三,Git * * \--1,概述 * \--2,常用命令 * \--3,准备环境 ## 一,作业 ## ### –1,需求: 模拟用户登录现象 ### 1,需要你自己创建user表,并提供一些字段(id name password) 2,向表中添加记录,如1 jack 123456 3,编写JDBC程序,完成登录 4,本质上就是向发起了select语句: select \* from user where name=‘jack’ and password=‘123456’ 5,当用户输入正确的用户名和密码时,提示登录成功,否则提示登录失败 ### –2,测试 ### package cn.tedu.test2; import java.sql.*; import java.util.Scanner; //测试 作业 /* 总结: 1, SQL攻击:出现了特殊的符号#,改变了SQL语义,本质上是因为用Statement 2, 解决方案:利用全新的传输器PreparedStatement, 本质上 把SQL骨架和SQL的参数分开执行的,遇到了#只是当做一个普通的文本而不是注释符号了 3, 优点: 省去了拼接SQL语句的麻烦, 防止了SQL攻击, 高效 */ public class Test1 { public static void main(String[] args) { // method();//用普通的传输器 method2();//用安全的传输器 } //用安全的传输器,解决SQL攻击 private static void method2() { try { //调用封装的方法,获取数据库的连接 Connection c = getConnection(); //3,准备SQL String a = new Scanner(System.in).nextLine() ; String b = new Scanner(System.in).nextLine() ; //SQL骨架,?叫占位符 String sql = "select * from user where name=? and password=?"; //4,获取 新的传输器 PreparedStatement s = c.prepareStatement(sql); //给SQL设置参数 s.setString(1,a);//给第1个?的位置,设置a的值 s.setString(2,b);//给第2个?的位置,设置b的值 //执行拼接好的 SQL ResultSet r = s.executeQuery(); //5,判断是否查到了数据,就直接登录,否则登录失败 if(r.next()){ System.out.println("恭喜您,登录成功~"); }else{ System.out.println("登录失败~"); } } catch (Exception e) { e.printStackTrace(); }finally{ //TODO 6,释放资源 r.close(); s.close(); c.close(); } } /** * 封装了方法,用来 获取数据库的连接 */ public static Connection getConnection() throws Exception{ //1,注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2,获取数据库的连接 String url = "jdbc:mysql://localhost:3306/cgb2107"; Connection c = DriverManager.getConnection(url,"root","root"); return c ;//返回给调用者 } //模拟登录 //SQL攻击/注入:当SQL语句中出现了#时,会把后面的SQL语句注释,改变了SQL的语义 private static void method() { try { //调用封装的方法,获取数据库的连接 Connection c = getConnection(); //3,获取传输器 Statement s = c.createStatement(); //4,利用传输器执行SQL,返回结果 // String sql = "select * from user where name='jack' and password='123'";参数写死了 //动态接受用户输入的用户名和密码,并动态拼接到SQL语句里 String a = new Scanner(System.in).nextLine() ; String b = new Scanner(System.in).nextLine() ; //当用户输入了特殊的名字时jack'#,发生了SQL攻击现象 String sql = "select * from user where name='"+a+"' and password='"+b+"'"; ResultSet r = s.executeQuery(sql); //5,判断是否查到了数据,就直接登录,否则登录失败 if(r.next()){ System.out.println("恭喜您,登录成功~"); }else{ System.out.println("登录失败~"); } //6,释放资源 r.close(); s.close(); c.close(); } catch (Exception e) { e.printStackTrace(); } } } ### –3,标准的释放资源 ### //用安全的传输器,解决SQL攻击 private static void method2() { //为了能让finally使用变量 Connection c = null; PreparedStatement s =null; ResultSet r =null; try { //调用封装的方法,获取数据库的连接 c = getConnection(); //3,准备SQL String a = new Scanner(System.in).nextLine() ; String b = new Scanner(System.in).nextLine() ; //SQL骨架,?叫占位符 String sql = "select * from user where name=? and password=?"; //4,获取 新的传输器 s = c.prepareStatement(sql); //给SQL设置参数 s.setString(1,a);//给第1个?的位置,设置a的值 s.setString(2,b);//给第2个?的位置,设置b的值 //执行拼接好的 SQL r = s.executeQuery(); //5,判断是否查到了数据,就直接登录,否则登录失败 if(r.next()){ System.out.println("恭喜您,登录成功~"); }else{ System.out.println("登录失败~"); } }catch (Exception e) { e.printStackTrace(); }finally{ //TODO 6,释放资源 if(c != null){ //为了防止空指针异常 try { c.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(r != null) { //为了防止空指针异常 try { r.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(s != null) { //为了防止空指针异常 try { s.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } ### –4,改造释放资源 ### /** * 封装了方法,用来 关闭资源 */ public static void close(Connection c,ResultSet r,PreparedStatement s){ if(r != null) { //为了防止空指针异常 try { r.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(s != null) { //为了防止空指针异常 try { s.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(c != null){ //为了防止空指针异常 try { c.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } //用安全的传输器,解决SQL攻击 private static void method2() { //为了能让finally使用变量 Connection c = null; PreparedStatement s =null; ResultSet r =null; try { //调用封装的方法,获取数据库的连接 c = getConnection(); //3,准备SQL String a = new Scanner(System.in).nextLine() ; String b = new Scanner(System.in).nextLine() ; //SQL骨架,?叫占位符 String sql = "select * from user where name=? and password=?"; //4,获取 新的传输器 s = c.prepareStatement(sql); //给SQL设置参数 s.setString(1,a);//给第1个?的位置,设置a的值 s.setString(2,b);//给第2个?的位置,设置b的值 //执行拼接好的 SQL r = s.executeQuery(); //5,判断是否查到了数据,就直接登录,否则登录失败 if(r.next()){ System.out.println("恭喜您,登录成功~"); }else{ System.out.println("登录失败~"); } }catch (Exception e) { e.printStackTrace(); }finally{ //TODO 6,释放资源 close(c,r,s); //调用封装的方法,释放资源 } } ## 二,HTML ## ### –1,概述 ### 是超文本标记语言.用来完成一个静态网页. 结构: 由大量的标签组成的. 标签都是成对儿出现的 ### –2,入门案例 ### <!DOCTYPE html> <!-- 文档声明 --> <html> <!-- 根元素,标记这是一个网页文件 --> <head><!-- 头部分 --> <meta charset="utf-8"> <!-- 设置了编码 --> <title>1243</title> <!-- 设置了标题 --> </head> <body> <!-- 体部分,指定网页要展示的内容--> hello </body> </html> ### –3,练习 ### <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试 常用标签</title> </head> <body> <!-- 1.标题标签:加粗会自动换行 h1大~h6小 --> <h1>残奥会,极富教育价值的“开学第一课”</h1> <h2>残奥会,极富教育价值的“开学第一课”</h2> <h3>残奥会,极富教育价值的“开学第一课”</h3> <h4>残奥会,极富教育价值的“开学第一课”</h4> <h5>残奥会,极富教育价值的“开学第一课”</h5> <h6>残奥会,极富教育价值的“开学第一课”</h6> <!-- 2.列表标签:有序orderlist列表ol li,无序unorderlist列表ul li --> <ul> <li>12345</li> <li>12345</li> <li>12345</li> <li>12345</li> <li>12345</li> <li>12345</li> </ul> <ol> <li>12345</li> <li>12345</li> <li>12345</li> <li>12345</li> <li>12345</li> <li>12345</li> </ol> <!-- 3. 图片标签img src属性指定图片的位置 height属性指定图片的高度 width指定宽度,单位是像素 --> <img src="2.jpg" height="500px" width="300px"/> <!-- 4. 超链接a href属性用来指定跳转的网址 target属性用来指定打开方式,默认是当前窗口_self,_blank是用新窗口打开 --> <a href="https://www.baidu.com" target="_blank">点我跳转</a> <!-- 5. 锚定 a --> <a name="top">我是顶部</a> <h2>如何套取富婆的欢心</h2> <h2>如何套取富婆的欢心</h2> <h2>如何套取富婆的欢心</h2> <h2>如何套取富婆的欢心</h2> <h2>如何套取富婆的欢心</h2> <h2>如何套取富婆的欢心</h2> <h2>如何套取富婆的欢心</h2> <a href="#top">点我,回到顶部</a> <br /><br /><br /><br /><br /><br /><br /> </body> </html> ## 三,Git ## ### –1,概述 ### 是一个开源的分布式的版本控制产品. 可以上传 开源项目 , 上传到Gitee服务器上. 很方便的管理代码, 还可以下载. 上传: 工作空间: 用来保存资源的一个文件夹 本地索引: 给即将上传的资源, 设置索引, 提高传输效率 本地仓库: 是指你自己电脑里 ,的一个文件夹 ,已经存好了要提交的资源 远程仓库: 是指在Gitee的服务里 ,创建一个文件夹 ,保存了 你提交的资源 下载: 只 从 远程仓库 下载 资源 到自己的电脑里 ### –2,常用命令 ### add : 从 工作空间把要上传的资源 添加到 本地索引 commit : 从本地索引 提交到 本地仓库 push : 从本地仓库把 资源 推送到 远程仓库 clone/pull : 从远程仓库 下载到 本地 ### –3,准备环境 ### 1, 安装Git软件,下一步就行了 2, 注册一个Gitee的账号 !!!3, 创建了一个本地仓库(在你自己的磁盘里创建的,存放你想要上传的资源) ![在这里插入图片描述][b576429b01074d2d877252a6c69916b9.png] !!!4, 创建了一个远程仓库(在Gitee服务器上,创建的) ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAY2dibHB4_size_20_color_FFFFFF_t_70_g_se_x_16] !!! 5, 执行一些自动生成的Git命令 在本地仓库,执行命令(在本地仓库的路径处,直接输入cmd): git config --global user.name "cgblpx" #配置在gitee上注册的账号 git config --global user.email "2250432165@qq.com" #配置在gitee上注册的邮箱 git config --list #检查配置信息 git init #初始化了git(产生了一个隐藏文件.git) git add . # 提交本地仓库的所有资源 git commit -m "first commit" #把本地索引的文件提交到本地仓库 git remote add origin https://gitee.com/cgblpx/cgb2107.git #建立本地仓库和远程仓库的关系 git push -u origin master #把本地仓库的资源 提交给Git服务器 #第一次上传文件,需要输入用户名和密码的...... [b576429b01074d2d877252a6c69916b9.png]: /images/20210911/6639c9b48db9442a9b97516958229f14.png [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAY2dibHB4_size_20_color_FFFFFF_t_70_g_se_x_16]: /images/20210911/906c41c1de71441fa6a509c627589ff1.png
相关 cgb2107-day08 文章目录 一,模拟 服务器解析浏览器发来的数据 二,CSS选择器 \--1,概述 \--2,简单选择器 旧城等待,/ 2021年09月11日 03:36/ 0 赞/ 267 阅读
相关 cgb2107-day06 文章目录 一,作业 \--1,需求: 模拟用户登录现象 \--2,测试 \--3,标准的释放资 淡淡的烟草味﹌/ 2021年09月11日 03:34/ 0 赞/ 271 阅读
还没有评论,来说两句吧...