SQL 注入攻击是将要执行的 SQL 代码添加特殊参数符号,然后传递到服务器解析。本质上是篡改原本sql的本意所执行的一种攻击手法。
利用新对象 PreparedStatement 对象完成,先将 SQL 骨架发送给数据库服务器,然后再将参数单独发给服务器,所以此时参数仅仅当成普通字符串来处理,进而起到防止SQL 注入的问题。
内连接查询:需要查找两张表同时存在的数据,使用内连接查询 左外连接查询:可以将左边表中的所有记录都查询出来,右边表只显示和左边表相对应的数据,如果左边表中某些记录在右边没有对应的数据,右边显示为null即可。
右外连接查询: 可以将右边表中的所有记录都查询出来,左边表只显示和右边表相对应的数据,如果右边表中的某些记录在左边表是没有对应的数据,则左边表数据显示为null即可。
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 的列上建立索引。 2.select查询语句应尽量避免使用星号(*),甚至不用星号查询 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 4.可以避免模糊查询的尽量不要用,因为模糊查询也会导致全表扫描 select id from t where name like ‘%abc%’ 5.合理的增加冗余的字段(减少多表的查询) 6.尽可能的使用 varchar 代替 char ,因为首先变长字符串存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内查询的效率显然要高。 7.减少使用 IN 和 NOT IN ,使用 exists,not exists 语句替代,原因也是避免导致全表扫描。 8.or 的查询尽量用 union 或者 union all 代替
扩展: 如果想将两张表中的所有数据都查询出来(左外+右外并去除重复记录),可以使用全外连接查询,但是mysql又不支持全外连接查询。
事务:简单的说就是将一堆的sql语句绑定在一起执行,要么都执行成功,要么执行都失败
事物有四大特点: 1.原子性:事务的所有操作要么都执行成功,要么都执行失败 2.一致性:事务执行后,业务数据之和是保持一致的。 解释:A给B转了100元,A的账户减去100,B的账户加上100,A+B的账户总和在这个过程总是不变的 3.隔离性:并发中的事务是不会互相干扰的 解释:事务A看不到事务B的执行中状态,B也同理。要么看到的是执行前的状态,要么看到的是执行后的状态 4.持久性:一旦事务提交成功后,事务中的所有数据都必须持久化到数据库中,即使数据库马上崩溃,也能通过某种机制恢复数据
1、READ UNCOMMITTED(读未提交数据)
安全性最差,可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)
但性能最好(不使用!!)
2、READ COMMITTED(读已提交数据)(Oracle默认)
安全性较差
性能较好
可以防止脏读,但不能防止不可重复读,也不能防止幻读;
3、REPEATABLE READ(可重复读)(MySQL默认)
安全性较高
性能较差
可以防止脏读和不可重复读,但不能防止幻读问题;
4、SERIALIZABLE(串行化)
安全性最高,不会出现任何并发问题,因为它对同一数据的访问是串行的,非并发访问;
性能最差;(不使用!!)
MySQL的默认隔离级别为REPEATABLE READ,即可以防止脏读和不可重复读
服务器:分为服务器硬件 (即是我们的电脑)和 服务器软件。在硬件服务器(计算机)上安装了服务器软件,才可以对外提供服务。比如:让其他的计算机来访问当前服务器,为其他的计算机提供服务。
(1) 服务器硬件:是指在互联网上具有独立IP地址的计算机,比如我们自己用的计算机也可以作为服务器使用。
(2) 服务器软件:就是一个计算机程序,比如MySQL服务器软件,tomcat服务器软件。服务器软件分为很多类型,比如:ftp服务器(上传或者下载资料),数据库服务器,web服务器软件,邮件服务器等。
(1) web服务器是指驻留在互联网上的某种类型的计算机程序。当浏览器访问服务器,请求服务器上的文件时,服务器将会处理该请求,并将请求的文件响应给浏览器,并会附带一些信息告诉浏览器如何查看该文件(即文件的类型)
(2) web服务器是可以向 “发出请求的浏览器提供文档” 的程序,比如在访问百度时,其实就是在访问百度的服务器。
Tomcat就是一个web服务器软件,是由apache组织提供的一款服务器软件,特点:小巧灵活,免费开源,简单易用。
HTTP协议在工作时所遵循的基本原则: (1)一次请求,只对应一次响应 (2)请求只能由浏览器发起,服务器只能被动的等待请求,根据请求作出回应。
Servlet是由SUN公司提供的一门动态Web资源开发技术,Servlet本质上是一段Java程序,和之前的Java程序不同的是,Servlet程序无法独立运行,需要将Servlet程序放在服务器中(比如tomcat服务器),由服务器调用才可以执行。
如果我们每个人去登录网页或者其它看到的内容都是不一致的,这就是动态web资源。(并不代表页面一定会动);如果我们每个人去京东看自己的购物车或者我们的订单,我们每个人看到的内容都是不一样的。
常用动态web资源开发技术:JSP/Servlet、ASP、PHP等。
如果我们每个人去登录网页区或者其它看到的内容都是一致的,这就是静态web资源(并不代表网页不会动) 静态web无法连接数据库;例如我们每个人去京东搜索手机,我们会看到同样的效果,我们每个人登录百度也是看到同样的效果。
静态web资源开发技术:HTML
1.创建servlet实例(Servlet的对象由服务器负责实例化 ) 2.当servlet实例化后,将调用这个对象的init()方法进行初始化 3.再调用对象的service()方法来处理请求,并返回处理结果,在调用service之前, 需保证init初始化已被成功执行 4.当需要释放servlet的时候,调用对象的destroy()方法来结束,并释放资源
request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。
当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。 其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。
注意:(执行service方法之前,response对象是空的)
在服务器调用Servlet程序的service方法之前,会创建请求对象Request,在请求处理完,响应结束时,就会销毁Request对象。
通过 response.setHeader(“Content-Type”, “text/html;charset=utf-8”)方法,通知服务器发送数据时的码表; 通过 response.setCharacterEncoding(“utf-8”)方法,通知浏览器解析时使用的码表。两码相同就不会有乱码了。
response 提供了 setContentType(“text/html;charset=UTF-8”)快捷方法,在它的底层, 会同时做上面两件事,所以可以一行代码解决 response 产生的乱码问题。
总结回答:出现乱码的原因就是编码和解码所用的码表不同所导致的现象,所以我们可以使用response对象通知服务器发送数据给客户端浏览器时所用的码表是什么,并且再使用response对象通知客户端浏览器解析时所用的码表是什么即可。
具体实现就是使用response对象的 setContentType方法,一行代码解决响应产生的乱码问题。
(1)转发是一次请求,一次响应 (2)请求转发前后,浏览器的地址栏地址不会发生变化。(浏览器–访问–> A --转发–> B,地址栏地址始终指向A的地址) (3)请求转发前后的request对象是同一个(转发前在A中的request和转发到B后,B中的request对象和A中的request对象是同一个。基于这一点,可以通过request从A带数据到B) (4)请求转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发。(A–转发–>B,A和B必须属于同一个Web应用!)
俗语解释:浏览器找AServlet借钱,AServlet没有钱借,回应给浏览器自己没钱,可以去找BServlet借,并且把BServlet的地址告诉给浏览器。
(1)重定向是两次请求、两次响应 (2)重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道这个跳转的过程,因此地址栏地址会变化) (3)重定向前后的request对象不是同一个(因为重定向是两次请求,服务器会根据两次请求创建两个不同的request对象,request对象不是同一个,也就不能在重定向时通过request带数据到目的地。) (4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。(进行跳转的两个资源之间没有限制)
(1)如果希望跳转前后地址栏地址不会发生变化, 只能使用转发; 如果希望跳转前后地址栏地址会发生变化, 只能使用重定向 (2)如果希望在跳转前后, 能够通过request对象带数据到目的地, 只能使用转发 (3)如果仅仅是做一个跳转,没有其他要求,此时推荐使用转发(转发是一次请求,一次响应,可以减少访问服务器的次数,降低服务器的压力)
1.Cookie是将会话中产生的数据保存在客户端,是客户端技术。 2.Cookie是基于两个头进行工作的:分别是Set-Cookie响应头和Cookie请求头 3.通过Set-Cookie响应头将cookie从服务器端发送给浏览器,让浏览器保存到内部;而浏览器一旦保存了cookie,以后浏览器每次访问服务器时,都会通过cookie请求头,将cookie信息再带回服务器中。在需要时,在服务器端可以获取请求中的cookie中的数据,从而实现某些功能。
1.Session是将会话中产生的数据保存在服务器端,是服务器端技术 2.Session是一个域对象,session中也保存了一个map集合,往session中存数据,其实就是将数据保存到session的map集合中。 3.通过session.setAttribute()方法可以将数据保存到session中,通过session.getAttribute()方法可以将数据从session中取出来。
cookie适合存储需要长时间保存、但对安全性要求不高的数据。 Cookie的应用:实现购物车、记住用户名、30天内自动登录等。
session中适合存储对安全性要求较高,但不需要长时间保存的数据。 Session的应用:保存登录状态、保存验证码
每一个Session在创建之后都会生成一个编号,编号会以cookie的形式发送给浏览器,浏览器以后每次访问服务器都会带着 此cookie,服务器就利用此 cookie区分浏览器找到对应的 session 空间。