FAT Functional Acceptance Testing 开发、测试环境
FWS Functional Web Service
Select * from news where title like '%#{title}%'
# 但由于这样写程序会报错,研发人员将SQL查询语句修改如下:
Select * from news where title like '%${title}%'
# 在这种情况下我们发现程序不再报错,但是此时产生了SQL语句拼接问题,如果java代码层面没有对用户输入的内容做处理势必会产生SQL注入漏洞。
# 可将SQL查询语句设计如下:
select * from news where tile like concat('%', #{title}, '%')
# 采用预编译机制,避免了SQL语句拼接的问题,从根源上防止了SQL注入漏洞的产生。
优点就是:简单,方便。可以把它想象成一个不用考虑缓存未命中情况的redis(同线程下)。
主要用途:1、传递参数。部分场景下,参数特别难以传递(比如:AOP中的变量传递到业务逻辑代码中)。此时用它就比较方便。
2、精简参数传递。有时候某些方法参数列表的参数个数特别多,把业务参数和一些辅助参数(又叫周边)混杂在一起,导致代码难以理解。此时可以同意把这些辅助参数放在ThreadLocal里,统一设置的context。
注意点:1、ThreadLocal不能跨线程。
2、设置的数据在读取之后一定要记得删除,不然由于线程池的原理,导致下次此线程再读取此数据时可能时返回的是上次该线程保存的数据,导致数据紊乱。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
重写(Override)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
transient是短暂的意思。对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略。 因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的内存中而不会写到磁盘里进行持久化。
(1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法被访问。
(2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
(3)一个静态变量不管是否被transient修饰,均不能被序列化(如果反序列化后类中static变量还有值,则值为当前JVM中对应static变量的值)。序列化保存的是对象状态,静态变量保存的是类状态,因此序列化并不保存静态变量。
this首先是一个对象,它代表调用这个函数的gits git对象。
来自应用安全国际组织OWASP的建议,对XSS最佳的防护应该结合以下两种方法:验证所有输入数据,有效检测攻击;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下:
明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
Select * from news where title like '%#{title}%'
# 但由于这样写程序会报错,研发人员将SQL查询语句修改如下:
Select * from news where title like '%${title}%'
# 在这种情况下我们发现程序不再报错,但是此时产生了SQL语句拼接问题,如果java代码层面没有对用户输入的内容做处理势必会产生SQL注入漏洞。
# 可将SQL查询语句设计如下:
select * from news where tile like concat('%', #{title}, '%')
# 采用预编译机制,避免了SQL语句拼接的问题,从根源上防止了SQL注入漏洞的产生。
git config user.name
git config user.email
git config --global user.name "username"
git config --global user.email "email"
本地数据(仓库)目录,工作目录,暂存区
//本地修改
显示工作路径下已修改的文件:git status
显示与上次提交版本文件的不同:git diff
把当前所有修改添加到下次提交中:git add .
把对某个文件的修改添加到下次提交中:git add -p <file>
提交本地的所有修改:git commit -a
附加消息提交:git commit -m 'message here'
提交历史从最新提交开始,显示所有的提交记录(显示hash, 作者信息,提交的标题和时间):git log
显示所有提交(仅显示提交的hash和message):git log --oneline
显示某个用户的所有提交:git log --author="username"
显示某个文件的所有修改:git log -p <file>
//分支与标签
列出所有的分支:git branch
切换分支:git checkout <branch>
基于当前分支创建新分支:git branch <new-branch>
基于远程分支创建新的可追溯的分支:git branch --track <new-branch> <remote-branch>
删除本地分支:git branch -d <branch>
给当前版本打标签:git tag <tag-name>
//更新与发布
列出对当前远程端的操作:git remote -v
显示远程端的信息:git remote show <remote>
添加新的远程端:git remote add <remote> <url>
下载远程端版本,但不合并到HEAD中:git fetch <remote>
下载远程端版本,并自动与HEAD版本合并:git remote pull <remote> <url>
将远程端版本合并到本地版本中:git pull origin master
将本地版本发布到远程端:git push remote <remote> <branch>
删除远程端分支:git push <remote> :<branch> (since Git v1.5.0) or git push <remote> --delete <branch> (since Git v1.7.0)
发布标签:git push --tags
//合并与重置
将分支合并到当前HEAD中:git merge <branch>
将当前HEAD版本重置到分支中:git rebase <branch> //Don't rebase published commit!
退出重置:git rebase --abort
解决冲突后继续重置:git rebase --continue
使用配置好的merge tool 解决冲突:git mergetool
在编辑器中手动解决冲突后,标记文件为已解决冲突:git add <resolved-file> git rm <resolved-file>
//撤销
放弃工作目录下的所有修改:git reset --hard HEAD
移除缓存区的所有文件(i.e. 撤销上次git add):git reset HEAD
放弃某个文件的所有本地修改:git checkout HEAD <file>
重置一个提交(通过创建一个截然不同的新提交)git revert <commit>
将HEAD重置到上一次提交的版本,并放弃之后的所有修改:git reset --hard <commit>
将HEAD重置到上一次提交的版本,并将之后的修改标记为未添加到缓存区的修改:git reset <commit>
将HEAD重置到上一次提交的版本,并保留未提交的本地修改:git reset --keep <commit>
当与别人和作开发时,会向别人贡献代码或者接收别人贡献的代码,有时候可能不想完全Merge别人贡献的代码,只想要其中的某一个提交,这时就可以使用:git cherry-pick <commit-id>
未添加到缓存区的修改:git reset
将HEAD重置到上一次提交的版本,并保留未提交的本地修改:git reset --keep
当与别人和作开发时,会向别人贡献代码或者接收别人贡献的代码,有时候可能不想完全Merge别人贡献的代码,只想要其中的某一个提交,这时就可以使用:git cherry-pick