【JSP思考】JSP中#{},${}和%{}的区别 #{} ${} %{}
JSP中#{}
,${}
和%{}
的区别:
#{}
:对语句进行预编译,此语句解析的是占位符?
,可以防止SQL注入, 比如打印出来的语句 select * from table where id=?
,预编译之后会变成select * from table where id = "1 or 1 = 1"
。给注入信息加上了引号,替换掉了,所以可以防止注入。
类比:Java中的PreparedStatement
预编译:预编译是做些代码文本的替换工作。是整个编译过程的最先做的工作。例如,C语言的宏定义
#define pi 3.14
,就是把对应的变量单纯的替换掉了。
我们这里的Java预编译,也就是把字符串本应该去掉的双引号(""),给原封不动得带上,单纯的替换掉了,不改变双引号。
比如,第一个占位符设置的是"Nemo",那这个占位符就原封不动得把"Nemo"(带上双引号) 给单纯的替换掉。这样可以防止注入,导致我们sql语句的结构被改变。
${}
${}
:则是不能防止SQL注入打印出来的语句 select * from table where id=2
实实在在的参数拼接而成,可能会被注入select * from table where id = 1 or 1 = 1
。
类比:Java中的Statement
%{}
%{}
:用在ognl表达式中是保证'{' 和 '}'之间的内容是OGNL表达式取值方式的
ognl表达式 即 对象导航图语言,用点来代替getset方法的调用,如配置文件properties中的. 。
如setName 我们可以使用.name
相当于oc中的点方法