JDk是开发用的工具包提供了java开发环境和运行环境
JRE是JDK中的运行环境,为java运行提供了环境
==是逻辑运算,基本类型和引用类型
equals是字符串对比,本质是==原因是string和int重写了equals方法,默认是引用类型比较,重写方法的类改为值比较
对象相等哈希值绝对相等 equals不一定相等
equals被覆盖hashcod也一定被覆盖
当final修饰类的时候这个类就不可以被继承
当final修饰方法的时候这个方法就不可以被重写
当final修饰的变量叫常量 常量必须初始化 初始化的值不可以改变
String 不属于基础类型,基础类型有 8 种:byte,short ,int ,long,float,dobule,char,boolean
String 属于对象。
整数类型:byte ,short,int,long
浮点型:float,double
字符型:char
布尔类型:boolean
隐式转换:自动转换/直接转换不需要特殊转换 类型的取值范围从小到大
转换的小公式: byte、short、char->int ->long ->float ->double
注意事项:
boolean不可以与其他类型转换
byte、short 不可以直接转换char
byte,short,char 在计算的时候必须要先转换成int在计算
byte/short/char会有一个默认的强制类型转换
向上转型:小的类型(子类或者实现类)转为大的类型(父类或者接口),其实多态就是一种向上转型
向下转型:的类型(父类或者接口)转为小的类型(子类或者实现类)
格式
小的类型 变量名 = (小的类型)大的类型的数据;
String 声明对象的时候是不可变的 每次添加都会生成新的string对象
stringBuffer stringBuilder是在原有的对象基础上操作数据
stringBuffer和stringBuilder的区别是 stringBuffer是线程不安全的 stringBuilder是线程安全的 所以stringbuffer性能高于stringBuilder
当多线程的时候使用stringBuilder
单线程使用 stringBuffer
不一样 分配的内存不一样
string声明变量的内存是通过java虚拟机分配到常量池中的
string初始化对象是被堆储存的
实例化stringBuffer对象然后appen数据然后用reverse()方法
/ 使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用
经常用于支付,不会应为手误多提交一次申请
不需要,抽象类不一定非要有抽象方法。原因是抽象类实现方法
不可以 原因是抽象类就是让其他类继承的然后重写实现的 final修饰后由于他的特性导致抽象类不可以被继承 所以不可以
按功能来分:输入流(input)、输出流(output)
按类型来分:字节流:按8位字符串单位字符流:按16位字符串单位
来输出和输入
Files.exists():检测文件路径是否存在。
Files.createFile():创建文件。
Files.createDirectory():创建文件夹。
Files.delete():删除一个文件或目录。
Files.copy():复制文件。
Files.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件。
collection是个集合的接口 它提供了对集合对象的基本接口方法 ,然后为集合提供了最大化统一操作 ,他是直接继承了set集合和list集合
collections是个集合工具类,为集合提供了一系列的静态方法 用于对集合中的元素进行排序,搜索及安全的保障
list 和 set 都是继承了接口
list 实现类 AbstractList(ArrayList LinkedList Vector(线程安全))
set 实现类 AbstractSet (HashSet LinkedSet TreeSet)
实现方法List比set多了个get方法(add,remove, , contains,size)
List 元素可重复 有序 ------Set 元素不可重复 无序
map 实现类 HashMap HashTable
实现方法比原来多了好几种(put,containsValue,containsKey KeySet, Values)
map元素不可重复 其中HashTable 为线程安全
HashMap去掉了HashTable中(Contains)方法但是添加了(containsValue,containsKey )
HashMap 不同步数据 HashTable同步数据 所以HashMao效率会高很多 但是HashTable线程安全
HashMap 允许控制键 HashTable 不允许控制键
增删改定位用HashMap 有序的key遍历用TreeMap
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值键。此类不保证映射的顺序。
HashMap的数据结构:HashMap是一个“链表散列”的数据结构,即数组和链表的结合体。
当我们向HashMap中添加put元素的时候根据Hash值获取下标
hashMap的初始长度16字节 扩容后为1.5倍
若是map表这个下标有元素则以链表的模式添加到链表的头/尾(最先添加的到链尾 新添加的到链表头) 没有就直接添加到当前位置
Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率冲O(n)—O(long)
ArrayList 有序 查询快插入慢 基础结构是动态数组 支持随机访问
LinKedList 无序 查询慢插入快 基础机构是 双向循环链表 不支持随机访问
poll() 和 remove() 都是从队列中取出一个元素,
poll() 在获取元素失败的时候会返回空,
remove() 失败的时候会抛出异常。
(1)iterator()要求容器返回一个Iterator。
(2) 使用next()获得序列中的一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator 可以用来遍历set和list集合 ListIterator 只能遍历List集合
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator 实现了Iterator 拥有更多功能:增加元素 替换元素 获取前后索引
break直接结束当前的执行进程
continue跳出当前循环执行下个循环
并行是两个或两个以上事件同一时刻发生;并发指两个或多个事件在同一时间间隔发生。
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
一个程序至少有一个进程,每一个进程都会有一个线程, 进程在执行过程中拥有独立的内存单元,线程共享内存资源,减少切换次数,从而效率更高。线程是进程的实体, 同一进程中的多个线程之间可以并发执
守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。
①. 继承Thread类创建线程类
②. 通过Runnable接口创建线程类
③. 通过Callable和Future创建线程
有点深的问题了,也看出一个Java程序员学习知识的广度。
线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。
线程run需要继承Thread来实现 run被称为线程体 通过调用start()方法来启动线程
start()启动一个线程,真正实现了多线程运行。无需等run方法代码执行完,就可以直接继续执行下面的代码;调用run方法使线程重就绪-到运行的 run方法 run方法包含了所有需要执行的数据。结束后线程终止 然后cup才会再调用其他线程
多线程执行时多使用start()方法
①. newFixedThreadPool(int nThreads):创建一个固定长度的线程池,
②. newCachedThreadPool():创建一个可缓存的线程池
③. newSingleThreadExecutor():这是一个单线程的Executor,它创建单个工作线程来执行任务,
④. newScheduledThreadPool(int corePoolSize)创建了一个固定长度的线程池,以延迟或定时的方式来执行任务
线程池有5种状态:Running、ShutDown、Stop、Tidying、Terminated。
线程安全在三个方面体现:
在Java中,锁共有4种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。
动态获取属性 动态获取对象方法
java中的反射机制:在运行的时候 调用class的类中任意一个属性和方法 ,调用任意信任的对象的属性和方法
简单说就是为了保存在内存中的各种对象的状态
2、什么情况下需要序列化
想把内存数据以文件夹或者数据库形势保存的时候
通过Rmi传输数据的时候
通过套接字传输对象时候
当想要给实现了某个接口的类中的方法,加一些额外的处理
就动态创建一个类用来代理,这个类拥有原本类的全部方法
而且还添加的而外处理的新类 具有解耦意义和灵活扩展性
因为想对数据做改变又怕出问题失去原有的部分然后就需要克隆
有两种方式:
1、实现Cloneable接口并重写Object类中的clone()方法;
2、 实现Serializable接口,通过对象的序列化和反序列化实现克隆
jsp经编译后就变成了Servlet.(JSP的本质就是Servlet )
jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。
Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。
JSP有9个内置对象:
page代表与一个页面相关的对象和属性。
request请求相关对象属性以及跳转的时候使用
session建立联系并存放数据的
application全局作用域
说一下 session 的工作原理?
session在服务器上类似散列表结构,存放了很多数据。
相当于大号的map,里面存放了sessionID键值,当我们向服务器请求时带上存放的数据就可以取出对应的值
可以但是比较麻烦
由于session中的数据是由cookie来传递的禁用了他就传输不了数据也就请求不了对相应的值
解决办法 1、手动url传递值 2、以文件形式保存session数据然后调用 3、修改配置文件php.ini让其自动赋值
拦截机制不同 ,底层结构不同,性能方面不同,配置方面不同
xxs又叫css 攻击手段是恶意输出Html对正在浏览的用户,通过插入脚本获取用户信息
XSS防范的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。
攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令
验证地址 Http Referer字段
使用验证码
请求地址中添加自定义数据token进行验证
在Http头中自定义属性并验证
通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中
XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
throw 抛出指定一个类型异常
throws抛出所有异常
final 修饰类不可以被继承
finally :异常中常常用存放关闭资源的代码
finalize object中的方法用来垃圾回收
可以: try是运行时异常 catch是普通异常
当只有运行时异常的时候可以忽略catch
finally不可以因为他要结尾关闭这个资源
都代表的htpp的url路径转移
forward:直接跳转 redirect 重定向
get只能请求url编码 post支持多种请求编码
get路径暴露外面不安全 post安全
get的url中传输的参数长度有限 post中没有
get有痕 / post无痕
图片ping常用于跟踪用户点击页面或动态广告曝光次数。
script标签可以得到从其他来源数据,这也是JSONP依赖的根据。
是数据json的一种使用,可以让网页从别的网域要数据
缺点:
只能使用Get请求
不能注册success、error等事件监听函数,不易确定JSONP请求是否失败
在加载执行的时候, 容易受到跨站请求伪造攻击
jsonp 动态创建script标签然后用其src获取js脚本 通过这个特性服务器不在放回json格式而是放回某函数js代码 在src=“调用” 上线跨区域访问
单列设计模式
观察者模式
装饰模式
适配器模式
工厂模式
代理模式
简洁 轻量 拥有控制反转和切面功能解决了代码之前的松耦合和业务和服务分区 是个ioc容器拥有框架
是个轻量级的控制反转和面向切面框架
通过控制反转来提高代码的松耦合
通过面向切面来分离业务逻辑和系统服务开发
管理bean的对象配置生命周期
是一个简单配置复杂组合的框架
ioc容器 控制反转 依赖注入
存储bend, servlet,接口 反射对象 Component用存储到map中
使用时通过依赖注入放射各种对象的属性数据 启动时xml文件就可以读取
在没有的ioc容器中运行中都是需要主动去创建对象去注入
在加入的ioc容器中运行中都是ioc自动创建对象去注入
把控制权交给spring来自动处理
面向切面 将交叉的java业务逻辑(安全日志事务)封装成切面 然后注入对象
在满足定义的需求是自动注入
ioc 是spring中控制反转的
ioc容器为一个耦合的大容器各种代码通过这个容器建立联系存储数据
他就像粘合剂成个主体掌控个个区域进来的代码粘合起来发挥作用
控制反转
没有注入ioc容器时 a依赖于b 那么初始化时必须要手动去创建b对象 主动权在自己手中
注入ioc a依赖于b 那么初始化的时候ioc容器会自动创建一个b调用到a需要的地方
吧控制权交个spring去处理
Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:
当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:
DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,与spring IOC容器无缝集成,从而可以获得Spring的优势。
文件上传的解析
通过 HandlerMapping 请求映射到处理器(HandlerExecutionChain异常 处理器 拦截器 HandlerInterceptor )
通过handlerAdapter 支持多种类型的处理器(HandlerExecutionChain中的处理器)
通过ViewResolver解析逻辑视图名到具体视图实现;
request.getAttribute()
Spring MVC的核心组件:
M:model 模型,业务流程,业务逻辑。
V:视图,渲染数据。
C:控制:接收客户端请求,分配任务。
视图解析器 解析modelAndview对象中的view
将该逻辑视图View对象解析为一个物理视图View对象;
1.工厂模式和模版模式都BeanFactory以及ApplicationContext创建中都用到了;
3.代理模式,在Aop实现中用到了JDK的动态代理;
4.策略模式 加载资源文件,在Aop的实现中
5.单例模式,在创建bean的时候。
工程模式 工厂方法 代理模式 策略模式 单例模式 适配器模式 观察者模式 装饰器模式 模板方法模式
定位物理解析器 :接收modelAndview/view中的数据
Modelandview是连接Model(模型层)和View(视图)数据承载工具类
作为载体就是吧model接收的数据传输给view然后渲染前端jsp
Model 利用其addAttribute()方法即可将服务器的值传递到jsp页面中 然后返回视图就好了;
ModelAndView包含model和view两部分,使用时需要自己实例化,利用ModelMap用来传值,
addobject 来设置Attribute参数名和参数值 setViewName设置视图名称 然后解析视图找到路径传输数据
json是一种数据交换格式
将后对象和数组分装以json的形式发送到前端 前端用js去调用json加密过的数据渲染页面
安全保密-轻便简介易上手-JavaScript原生支持 最大限度切合后端代码
占用字符数量极少,特别适合互联网传递
内连接关键字:inner join;左连接:left join;右连接:right join。
建立索引
修改编码方式的改变
in先查子表 exists先查主表再查子表然后判断条件
not in 那么内外表都进行全表扫描,没有用到索引
not extsts 的子查询依然能用到表上的索引
所以无论那个表大,用not exists都比not in要快。
sum() 求和
avg() 求平均(期望)
max() 最大值
min() 最小值
conut() 计数(求有多少个记录)
last() 最后一条数据
first()第一条数据
比较运算符 | 说明 |
---|---|
= | 等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
<=> | 安全的等于,不会返回 UNKNOWN |
<> 或!= | 不等于 |
IS NULL 或 ISNULL | 判断一个值是否为 NULL |
IS NOT NULL | 判断一个值是否不为 NULL |
LEAST | 当有两个或多个参数时,返回最小值 |
GREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
order by: 排序 desc降序 asc升序 默认是升序
group by:分组查询
加快以莫字段访问速度
主键一定是唯一性索引。
但是一张表中可以有多个唯一性索引,所以唯一性索引不一定是主键。
保证数据的唯一性
study表中study_name属性和teacher表中的study_name表建立联系
这时就建立起联系study中study_name有的属性 teacher中的study_name才可以入参
好处就是删除study中的属性时teacher中对应的属性也会发生改变
大大减少查询带来的负担 若是没有加索引就是建立了联系需要去删除数据时就会响应很长时间
加了索引就可以快速定位关联数据然后响应
逻辑分页:将数据一次性从数据库查出到内存中,在内存中进行逻辑上的分页
物理分页:直接特定的SQL语句,只从数据库中查询出需要的数据
mysql自带的RowBounds分页属于逻辑分页
物理分页优于逻辑分页 (具体看实际)
一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
二级缓存:也是采用 PerpetualCache,HashMap 存储,其存储作用域为 Mapper(Namespace),并且可自定义存储源。默认关闭需要自启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;
对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
私密
防止恶意刷 防刷
访问地址加密 实现是由尾连接实现的
登录成功后服务器放回前端一个带有一个到规定时间自动销毁的token
Token-UserId以键值对的形式存放在缓存服务器中
发起请求判断token的有效性若是无效则需要重新登录获取新的token
保证timestamp和nonce针对每个API保持唯一性
缺点也很明显 一个“逗比“通过连点器在时间戳的60秒内疯狂响应
缺点就是 怎么多数据都保存下来你的服务吃的消嘛
nonce的一次性可以解决timestamp参数时间限制的问题,timestamp可以解决nonce参数在数据库“集合”越来越大的问题。在timestamp方案的基础上,加上nonce参数,由于对参数不能超过60秒的特性,我们只需要储存60秒的nonce参数即可
当前时间-当前时间+服务时间
LocalTime2(当前本地时间) - LocalTime1 + ServerTime
签名机制
算法:signature(签名) = MD5算法(token+timestamp+nonce+业务参数)
将“API接口中的token、timestamp、nonce、业务参数"进行MD5算法加密,加密后的数据就是本次请求的签名signature,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。
具体流程:
给部分人的ip授权其余人不允许访问
只有在token还生效、timestamp未超60秒、缓存服务器中不存在nonce都满足的前提下,接口请求才有效。服务端可以写一个过滤器对token、timestamp和nonce进行过滤和验证
对一段用MD5加密的编码用hash算法来解密
对明文编码生成信息摘要,以防止被篡改。比如MD5使用的是Hash,无论多长的输入,MD5都会输出长度为128bits的一个串。
摘要算法不要秘钥,客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文
对称加密算法是共享密钥加密算法,在加密解密过程中,使用的密钥只有一个。发送和接收双方事先都知道加密的密钥,均使用这个密钥对数据进行加密和解密。
**数据加密:**在对称加密算法中,数据发送方将明文 (原始数据) 和 加密密钥一起经过加密处理,生成复杂的密文进行发送。
数据解密:数据接收方收到密文后,使用加密的密钥及相同算法的逆算法对加密的密文进行解密,将使其恢复成可读明文。
非对称加密
非对称加密算法,有两个密钥,一个称为公开私钥 (publickey),另一个称为 私有密钥 (private key),加密和解密使用的是两个不同的密钥,所以这种算法称为非对称加密算法。
如果使用公钥对数据进行加密,只有用对应的私钥才能进行解密。
如果使用私钥 对数据进行加密,只有用对应的公钥才能进行解密。
常见加密算法的处理方式
根据上述常见的加密算法,测试人员在测试不同的加密接口可采用下述的方法处理加密接口
**摘要算法(MD5.SHA1 ):**造接口数据前调用MD5,SHA1进行编码,服务端对比编码后的字符串是否一致。
**对称加密算法(AES,DES ):**造接口数据前从开发获取对称公钥,基于对称公钥可以加密请求数据,解密响应报文。
**非对称加密算法(RSA):**造接口数据前从开发获取公钥私钥去加密解密接口数据
下面以Jmete为例介绍如何实现加密接口的处理,目前有一接口在服务器实现逻辑处理以前会对接口数据进行SHA加密,服务器获取到加密接口数据以后先解密和验证数据是否合法有效,再进行逻辑处理。针对这种接口测试的时候,在发起请求以前,我们需要对接口进入如下特殊处理:
和开发沟通接口加密的算法以及需要的信息,如果是SHA加密,和开发沟通获取加密的秘钥,以及加密和编码的关键字符串
在发起接口请求以前,对接口明文数据进行预处理,在Jmeter的接口实现中,可以通过添加Beanshell脚本,在Beanshell脚本中基于上一个步骤获取到的信息,采用和服务端相同的加密方法和加密流程对接口明文进行加密和编码
基于加密后的密文发起加密请求
对其电脑的ip进行获取若是他一直请求就弹出窗口警搞或者添加滑块和验证码
1、是否考虑这个列是否会对这个分组函数造成影响
2、聚合函数不和分组函数的列相关 分组函函数不和聚合函数的列相关