问题一:jsp和servlet有什么区别?
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序,主要功能在于交互式地浏览和生成数据,生成动态web内容。
- jsp经过编译后就变成了Servlet;jsp本质就是servlet,JVM能够识别Java类,不能识别JSP的代码,web容器将jsp的代码编译成jvm能够识别的Java类
- jsp更多的作用于页面的显示,servlet则用来逻辑控制
- servlet没有内置对象,jsp的内置对象需要通过HttpSevletRequest对象、HttpServletResponse对象、HttpServlet对象得到
- jsp是Servlet的一种简化,使用jsp是为了完成需要输出到客户端的内容,jsp中Java代码如何镶嵌到一个类中,由jsp容器完成。而servlet是个Java类,其中的service方法用于生成对客户端的响应。
问题二:jsp有哪些内置对象?作用分别是什么?
九大内置对象:
- request:封装客户端请求
- response:封装服务器对客户端的响应
- pageContext:通过pageContext对象可以获得其他8个对象
- session:封装用户会话的对象
- out:向客户端输出服务器响应的输出流对象
- config:web应用的配置对象
- page:jsp页面本身
- exception:封装页面抛出异常的对象
问题三:说一下jsp的四种作用域?
作用域:jsp创建的对象的生命周期和可访问性
**page 、request 、session 、aplication **
- page作用域代表当前页面相关的对象和属性,可理解为Java中的this,离开当前页面,page的所有属性会失效
- request作用域是在一个请求内的对象和属性。一个请求可能跨越多个页面,通过forward方式跳转,则仍然保留request的属性值,通过redirect方式,相当于重新发出了请求,request中的属性值会丢失。需要在页面显示临时数据可以采用此作用域。
- session是一个用户与服务器建立的一次会话的对象和属性。与某个用户相关的数据应放在用户自己的session中。
- application是整个web应用程序相关的对象和属性,实质是跨越整个web应用程序。
问题四:session和cookie有什么区别?
http是无状态协议,也就是对于事务处理没有记忆能力。为了保持http的连接状态,Cookie和Session就应运而生了。
- Cookie是通过客户端保持状态的解决方案。Cookie是由服务器发给客户端的特殊信息,这些信息以文本文件的形式存放在客户端,然后客户端每次向服务器发送请求时都会带上这些信息,这样当服务器在接收客户端请求后,就能够分析存放在请求头(Request Header)的cookie信息,来动态生成与该客户端相对应的内容。
- Session是通过服务器来保持状态。session是客户端与服务器一系列的交互动作称为一个session。在创建session的同时,服务器会为该session生成唯一的session id,然后可以通过调用session相关方法存放内容。存放的内容会保存在服务器,而把session id发到客户端。当客户端再次发送请求时,会把session id发到服务器,找到相应的session。
问题五:说一下session的工作原理?
Session的内容是保存在服务器端,通常是在内存中,也可以在文件、数据库等。客户端和服务器通过session id关联。Session id一般以cookie的形式存放在客户端,每次http请求,session id会随着cookie传递到服务器,服务器以此判断哪个用户的请求。
问题六:如果客户端禁用cookie,session还能用吗?
答案是不能用了,因为Session id就存放cookie中,没有cookie也就得不到session了。
还可以通过以下途径:
- 重写url,将session id作为参数追加在原url中
问题七:spring mvc和struts2的区别是什么?
- 拦截机制不同
Struts2拦截的是类,每一次请求都会创建一个相应的Action,和spring整合时Struts2的ActionBean注入作用域是原型模式,然后通过get、set方法把request数据注入到属性。Struts2中一个Action对应一个request、response,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts中Action的一个方法对应一个url,而类属性却被所有方法共享,这也就无法用注解标识其所属方法,只能设计为多例。
注:原型模式:用一个已经创建的实例作为原型,通过复制该原型对象创建一个和原型相同或相似的新对象。
Spring mvc是方法级别的拦截器,一个方法对应一个request,所以方法基本是独立的,独享request、response数据。而每个方法又和一个url对应,参数是直接注入到方法中,是方法独有的。和Sring整合时,SpringMVC的ControllerBean默认是单例模式(singleton),所以,默认对所有的请求,只会创建一个Controller,又没有共享属性,所以线程安全。要改变默认作用域,只需添加@Scope注解。(@Scope(“prototype”))多例
Struts2用的是拦截机制Interceptor,SpringMVC用的是独立的AOP,这样Struts2的配置文件量就比较大。
- 底层框架不同
Strutsz2采用Filter实现,SpringMVC采用Servlet实现。filter在容器启动时即初始化,服务停止销毁,晚于Servlet。而Servlet是在调用是初始化,先于Filter调用,服务停止销毁。
注:servlet和filter有什么区别?
servlet是运行在服务器端的Java应用程序,具有独立于平台和协议的特性,可以动态生成web页面,工作在客户端请求与服务器响应的中间层
filter是一个可复用的代码片段,可以用来转换http请求、响应和头信息。filter不像servlet,不能产生请求或响应,只能修改某一资源的请求或响应。
区别:servlet的流程较短,url来了之后对其进行处理,处理完就返回数据或转向另一页面;
filter流程长,在一个filter处理后,还能转向另一个filter再交给servlet,但是servlet处理后不能向下传递。
filter可以用来进行字符编码的过滤,检测用户是否登录,禁止页面缓存等功能。
-
性能方面
Struts2是类级别的拦截器,每次请求对应实例一个新的Action,需要加载所有的属性值注入,而SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,又加载一次单例模式bean注入,所以,SpringMVC效率和性能更高。 -
配置方面
SpringMVC和Spring是无缝的,在项目的管理和安全上也比Struts2高。虽然Struts2也可以通过不同的目录结构和相关配置做到一样的效果,但xml配置过多。
问题八:如何避免sql注入?
首先什么是sql注入?
在事先定义好的查询语句结尾添加额外的SQL语句,实现欺骗数据库的查询操作。
如,不需要密码即可查询:
select * from user where username = 'admin' or 1=1-- and password='’;
- PreparedStatement:采用预编译,sql语句准备好,只把输入值代替占位符即可,使用setxxx方法传值;
- 使用正则表达式过滤传入参数
典型的SQL 注入攻击的正则表达式 :
/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
- 字符串过滤:可以设置自己需要的字符串
public static boolean sql_inj(String str){
String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
String inj_stra[] = split(inj_str,"|");
for (int i=0 ; i < inj_stra.length ; i++ ){
if (str.indexOf(inj_stra[i])>=0){
return true;
}
}
return false;
}
- 在jsp中调用该函数是否包含非法字符串
public class sql_inj{
public static boolean sql_inj(String str){
String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
//这里的东西还可以自己添加
String[] inj_stra=inj_str.split("\\|");
for (int i=0 ; i < inj_stra.length ; i++ ){
if (str.indexOf(inj_stra[i])>=0){
return true;
}
}
return false;
}
}
- 在jsp页面判断代码:使用JavaScript在客户端进行不安全字符屏蔽
检查是否有’ , \ / 等非法字符:
function check(a){
return 1;
fibdn = new Array (”‘” ,”\\”,”/”);
i=fibdn.length;
j=a.length;
for (ii=0; ii<i; ii++)
{ for (jj=0; jj<j; jj++)
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem’; p1==temp2)
{ return 0; }
}
}
return 1;
}
总的来说,就是在代码规范中检查用户输入的字符串是否合法,或者直接用preparedstatement进行预编译
问题九:什么是xss攻击,如何避免?
xss全称Cross Site Script(跨站脚本攻击),攻击者向web页面中插入恶意的脚本代码(css代码,JavaScript代码、HTML标签等),当用户浏览该页面时,嵌入的脚本代码会执行,达到恶意攻击用户的目的。如盗取用户cookie、破坏页面结构、重定向其他网站等。
xss攻击类似sql注入,通过插入恶意脚本,实现对用户浏览器的控制,获取用户信息。
总体防范思路:对输入和url参数进行过滤,对输出编码。
问题十:什么是CSRF攻击,如何避免?
Cross-site request forgery,跨站请求伪造 。攻击者在用户已经登录的网站,通过伪造用户的请求,使目标网站误以为是用户的真实操作。常用于盗取账号、转账、发送虚假信息等。
如何避免:
防御CSRF的几种策略
- 验证HTTP Referer字段
- 使用验证码:在关键操作页面添加验证码,后台收到请求会通过判断验证码防御CSRF;但对用户不太友好。
- 在请求地址添加token并验证
- 在HTTP头中自定义属性并验证