1,Web 应用十大安全隐患
1) SQL 注入 2) 跨站脚本攻击XSS (Cross Site Scripting) 3) 遭破坏的认证和会话管理 4) 不安全的对象直接引用 5) 伪造跨站请求(CSRF)
6) 安全误配置(Security Misconfiguration) 7) 限制远程访问失败(Failure to Restrict URL Access) 8) 未验证的重定向和传递
9) 不安全的加密存储 10) 不足的传输层保护
2, Oracle 临时表
事务临时表:
Create global temporary table Temp_user
(ID NUMBER(12) Primary key,name varchar2(10))
ON COMMIT DELETE ROWS ;
会话临时表:
CREATE GLOBAL TEMPOPARY TABLE TEMP_USER
(ID NUMBER(12) Primary key,name varchar2(10))
ON COMMIT PRESERVE ROWS ;
区别:
事务临时表,在提交事务后,表中的数据就消失了,但是会话临时表不会!~
会话临时表,提交事务后,依旧能查询,但是关闭数据后,重新连接时,表中的数据才会消失!~
3,空值查询问题
create table tmp_test
(id int not null primary key,
username varchar2(30),
nickname varchar2(50),
address varchar2(300)
);
commit;
insert into tmp_test
values (1,‘1001‘,‘jack‘,‘shenzhen‘);
insert into tmp_test
values (2,‘1002‘,null,‘shanghai‘);
insert into tmp_test
values (3,‘1003‘,‘‘,‘wuhan‘);
commit;
select * from tmp_test
where nickname not in (‘jack‘);
select * from tmp_test
where nvl(nickname,‘#‘) not in (‘jack‘);
4,Spring 的IOC和AOP
IOC:控制反转也叫依赖注入。利用了工厂模式
将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
AOP:面向切面编程
OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。
将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
5,Spring的事物管理
声明式事务(基于AOP,TransactionManager),编程式事务
http://lzh166.iteye.com/blog/1134146
http://blog.csdn.net/java_min/article/details/4427523
6,过滤器和拦截器
过滤器:Filter对在web.xml中该filter配置的路径进行单向拦截, request匹配Filter的路径时做一次拦截,单向拦截
拦截器:Interceptor是不对request进行处理的, 它只是对action起作用,双向拦截
Filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制。
Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。
Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤
http://blog.csdn.net/x_yp/article/details/6358630
7,Oracle Connect by
select level, count(level)
from employee_lamar e
start with (e.dept_id = ‘101‘ and e.manager_emp_id is null)
connect by prior e.emp_id = e.manager_emp_id
group by level
order by level;
8,Oracle自定义变量
1) type类型 v_name table_name.column_name%type
v_ename emp.ename%type
select ename into v_ename from emp where empno=7900;
2) rowtype类型 v_name table_name%rowtype
v_row emp%rowtype
select * into v_row from emp where empno=7900;
dbms_output.put_line(‘ename=‘ || v_row.ename);
3) record类型
自定义类型通常会放到在包中
create or replace package my_package
as
--自定义一个类型
type myType is record(
xm emp.ename%type, --姓名
gzuo emp.job%type, --工作
gzi emp.sal%type --工资
);
end;
然后就可以在程序块中直接使用该类型
declare
--使用包中的自定义类型来定义变量
myValue my_bao.myType;
begin
select ename,job,sal into myValue from emp where empno=7844;
dbms_output.put_line(‘ename=‘||myValue.xm);
dbms_output.put_line(‘job=‘||myValue.gzuo);
dbms_output.put_line(‘sal=‘||myValue.gzi);
end;
4) table类型
语法: type 类型名 is table of 值类型 index by 键类型
值类型:指实际保存的数据的类型 键类型:类型有两种:binary_integer 或者 pls_integer
示例:用字符串做索引
declare
--定义表结构
type myTabType is table of char(2) index by varchar2(5);
sexTab myTabType;
v_sex_code varchar2(5);
v_sex_name char(2);
begin
--往表中添加内容
sexTab(‘nan‘):=‘男‘;
sexTab(‘nv‘):=‘女‘;
--用户输入
v_sex_code:=‘&性别编号‘;
v_sex_name:=sexTab(v_sex_code);
dbms_output.put_line(‘您的性别是 = ‘||v_sex_name);
end;