Java经典面试题六:Java Web

问题一: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头中自定义属性并验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值