java web常见面试题总结

六. Java Web模块
64.JSP 和 servlet 有什么区别?

答:servlet是一种服务器端的java应用程序,由web容器加载和管理,用于生成动态web内容,负责处理客户端请求;
jsp是servlet的扩展,本质上还是servlet,每一个jsp都是servlet的一个实例,jsp页面会被web容器编译servlet,在由servlet响应客户请求。

区别:servlet适合动态输出web数据和业务逻辑处理,对于html页面的修改很不方便;
	  jsp是在html代码中嵌入java代码,适合页面显示。
	  
	  两者的内置对象不同,获取内置对象的方法也不同。

65.JSP 有哪些内置对象?作用分别是什么?

答:request:请求对象,该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息;
response:响应对象,对用户的请求做出响应,像客户端发送数据;
session:会话对象,用来存储客户端请求的信息,作用域为这个会话,不同客户使用不同的session对象;
application:应用程序对象,用于存储该应用程序全局共享的信息,作用域为整个应用程序,所有客户使用的都是同一个application对象;
out:out对象是个输出流,用于向客户端输出数据;
page:page对象对应jsp页面本身,相当于转换为servlet后的this,一般很少用到;
config:配置对象,该实例代表jsp页面的配置信息,通常jsp无需配置,也就不存在配置信息,还对象更多在servlet中有效;
exception:异常对象,代表其他页面中的异常和错误,只有当页面是错误处理页面,该对象才可用。
pageContext:页面上下文对象,代表当前页面运行的一些属性,通过该对象可以拿到其他8大对象,使用该对象可以访问该页面中的共享数据。

66.说一下 JSP 的 4 种作用域?

答:application:应用程序作用域,存储的信息在整个应用程序范围内都可以访问,生命周期为应用程序的开启到停止;
session:会话作用域,存储的信息仅能够在当前会话进行访问,客户端首次访问会生成一个新的会话并且服务器会记住,生命周期为会话结束或服务器强制是会话失效;
request:请求作用域,存储的信息仅在当前请求有效,请求重定向后便无法访问;
page:页面作用域,仅能够访问当前页面的保存的信息。

67.session 和 cookie 有什么区别?

答:session是保存在服务端客户端不知道的信息,cookie保存在客户端服务端知道的信息;
session中保存的是对象,cookie中保存的是字符串;
session在用户会话结束后就会关闭了,cookie可以长期保存在客户端;

session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都能够进行访问,如果cookie设置了
路径参数,不同路径下的cookie是互相访问不到的。

session需要借助cookie才能够正常的进行工作,如果客户端禁用cookie,那么session将会失效,但是服务器端启动了url编码,
如URLEncoder.encode("xxxxx?xx=xx","utf-8");,则url后面会携带者cookie信息,服务器通过此也是可以进行session的判断的。

68.说一下 session 的工作原理?

答:当客户端首次访问应用时,服务端会为其产生一个唯一的sessionId并保存在服务器端,然后在响应客户端时将该sessionId填充到
响应头的JSESSIONID字段发送给客户端,客户端接收到后会以cookie的形式保存该sessionId,在接下来的访问请求中会携带该sessionId,
作为本次会话的一个标识,服务端会在这些请求中过滤出cookie中sessionId,判断其是否存在和有效,是则在会话作用域响应其请求,
否则响应错误信息。一般来说session要依赖cookie才能够正常工作的,如果浏览器禁用了cookie,session也就会失效,但是如果对
url进行重写,那么服务器也是能够在url中解析出sessionId的。

69.如果客户端禁止 cookie 能实现 session 还能用吗?

答:还是能用的,可以使用Url重写,加sessionId防止url中,同时服务器端启动url编码,这样便能够在url中解析出sessionId;
或者将sessionId放在请求头中,使用一个自定义的token字段,通过请求过滤器读取请求头信息,然后解析出sessionId。

70.spring mvc 和 struts 的区别是什么?

答:springmvc是通过servlet的方式进行拦截,在第一次请求发送时初始化,容器关闭时销毁,
struts是通过filter的方式进行拦截,在容器初始化时加载,晚于servlet销毁。

springmvc是方法级别上的拦截,一个请求对应一个controller的一个方法,controller默认是单例的,所以类中属性被所有
方法共享(在controller中定义变量会出现线程安全问题,所以不建议,要使用就设置该controller为多例模式),但是接受
请求参数是通过方法的形参接受的,保证了线程的安全性,性能高和易于管理,与spring完美结合,几乎0配置,可以使用注解开发;

struts是类级别上的拦截,每个请求都会实例化一个Action,一个Url对应一个Action中的方法,类的属性被所有方法共享,
而struts是通过类的属性接受请求参数的,所有如果是单例模式下,多个请求同时请求一个Action,会造成属性混乱,出现线程
安全问题。由于每次请求都会创建一个Action,开销大,消耗系统资源多,容易导致性能瓶颈和管理上的困扰,又因为是多例的,
无法使用spring注解进行开发,需要进行大量的文件配置。

springmvc是使用aop方式,struts有自己的拦截器机制

71.如何避免 SQL 注入?

答:1、进行参数过滤,排查掉可疑数据
2、避免使用动态Sql,尽可能使用sql语句的预编译进行参数化查询
3、对敏感数据加密
4、避免直接向用户显示数据库的错误信息
5、限制数据库权限和特权

72.什么是 XSS 攻击,如何避免?

答:xss原名为css,跨站脚本攻击,是被动式的用于客户端的攻击方式,通常是向含有xss漏洞的网站输入恶意的html或JavaScript代码。

避免:可以对输入进行过滤,对输出进行编码,白名单和黑名单结合,为cookie设置httpOnly(true)。

73.什么是 CSRF 攻击,如何避免?

答:跨站请求伪造,通过冒用受害者的身份请求已登录网站下的数据。

避免:1、验证HTTP REferer字段,referer字段记录了请求的来源地址,只能在同一个网站内发起请求;
	  2、使用验证码,用户体验不好。
	  3、在请求头加入自定义的属性并验证
	  4、在请求地址中加入token并验证
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值