1、session和cookie区别?
cookie:
在浏览器端缓存诸如用户输入等小型非敏感数据,不安全。
关闭浏览器cookie销毁除非设置了有效期
session:
在服务器端存储诸如数据库查询等敏感数据,session id自动由浏览器端cookie维护。
session id和session丢失一个,session失效
session id丢失:
关闭浏览器,cookie丢失,session id丢失
session丢失:
用户退出登录,或服务器关闭,session到期(默认30min),session丢失
2、PreparedStatment和Statment的区别?
Statment:
不能够对SQL进行动态的赋值
容易发生SQL注入
对于相同的SQL,如果只是值不同,mysql会对每条SQL进行编译,编译很耗时。
PreparedStatment:
可以对SQL进行动态赋值,问号当做占位符
会对传入的值多特殊处理,过滤掉非法字符,能避免SQL注入
对于相同的SQL,如果只是值不同,mysql只会编译一次。
SQL注入:
如果将用户提交的数据插入到数据库中,数据中含有“1 or 1”等非法字符,会原封不动地拼接在SQL语句中,就会对数据库造成损害,或者数据泄露。
3、ThreadLocal
ThreadLocal:
解决一个线程内所有代码间的数据共享
场景:
由于用户的一次请求创建一个线程,我们可以利用ThreadLocal封装Connection对象,实现Web项目中单次请求的jdbc事务操作
助记思路:
dao层代码:
ThreadLocal<Connection> thread=new ThreadLocal();
Connection conn=thread.getConnection(url,user,password);
if(conn==null){
conn=DriverManager.getConnection(url,user,password);
thread.set(conn);
}
service层逻辑:
调用dao层方法获取Connection连接,调用dao层方法执行事务内的多次DML操作,
DML操作全部执行成功,提交事务,否则回滚事务。
事务操作结束关闭连接。
###DML操作全部执行成功的判定:
由于使用executeUpdate方法进行DML操作,该方法返回的此次操作影响的记录条数。
我们判断所有DML操作返回值是否包含0,不含0则DML操作全部执行成功。
拓展:
ThreadLocal可不可以替代数据库连接池技术?
=========================================
回顾servlet三大作用域对象
request:一次请求内的数据共享
session:一个用户多次请求间的数据共享
application:多个用户间的数据共享。一个web项目中只有一个application对象。