Java面试题08

文章详细比较了JSP与Servlet的区别,包括实现方式、页面显示、性能和可读性,并介绍了JSP的内置对象和作用域。还讨论了Session和Cookie的区别,以及如何避免SQL注入、XSS和CSRF攻击。最后,提到了SpringMVC和Struts框架的对比以及各自的特性。
摘要由CSDN通过智能技术生成

1.jsp 和 servlet 有什么区别?

JSP(JavaServer Pages)是一种在HTML中嵌入Java代码的技术,适合用于生成动态内容; Servlet是Java编写的服务器端程序,用于处理HTTP请求和响应。

JSP (Java Server Pages) 和 Servlet 都是用于创建动态网页的技术,它们都基于 Java 语言,但是有以下一些主要的区别:

  1. 实现方式:Servlet 是一个 Java 类,必须显式地继承 HttpServlet 类,并重写其中的一些方法。JSP 是一个基于 Servlet 的技术,它允许开发人员通过 XML 格式的页面来编写动态内容,而不需要直接编写 Java 代码。
  2. 页面显示:在 Servlet 中,所有的代码都在 Java 文件中,并且显示结果也是通过 Java 代码生成的。而在 JSP 中,显示结果是通过 HTML 和其他标记语言(如 JSTL, Jsf 等)生成的,而处理业务逻辑的代码被嵌入到这些标记中。
  3. 性能:由于 JSP 页面第一次运行时会被转化为 Servlet,所以 Servlet 的性能通常会比 JSP 高。然而,当开发大型应用程序时,JSP 的便利性和易用性可能会超过其性能上的损失。
  4. 可读性:由于 JSP 允许开发人员使用 HTML 和其他标记语言来编写页面,所以它的可读性通常比 Servlet 高。对于非 Java 开发人员来说,JSP 可能比 Servlet 更易于理解。
  5. 用途:Servlet 主要用于处理复杂的业务逻辑,而 JSP 主要用于生成用户界面。然而,在实际开发中,这两种技术经常一起使用。
  6. 可维护性:由于 JSP 的代码被嵌入到 HTML 中,所以当需要修改页面布局或样式时,可能需要对 JSP 文件进行修改。而 Servlet 则可以独立于页面布局进行修改。

总的来说,JSP 和 Servlet 有各自的优势和用途。在选择使用哪种技术时,需要根据项目的具体需求和开发团队的技能来决定。

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

JSP有9个内置对象,包括request、response、session、application、out、page、 pageContext、config和exception,用于在JSP页面中访问HTTP请求和其他上下文信息。

JSP(Java Server Pages)内置了九个对象,它们不需要初始化就可以直接使用。这些内置对象如下:

  1. request: 这个对象用于获取客户端发送的请求信息。例如,你可以使用这个对象获取查询参数、请求头、客户端的 IP 地址等。
  2. response: 这个对象用于向客户端发送响应。你可以使用这个对象设置响应头、设置 cookie 等。
  3. pageContext: 这个对象用于管理 JSP 页面的上下文。你可以使用这个对象获取页面参数、页面属性等。
  4. session: 这个对象用于在多个请求之间保存客户端的状态。你可以使用这个对象保存用户的登录状态等。
  5. application: 这个对象用于在整个应用范围内共享数据。所有的用户都可以访问到这个对象保存的数据。
  6. out: 这个对象用于发送响应到客户端。你可以使用这个对象向客户端发送 HTML 内容、XML 内容等。
  7. config: 这个对象用于获取 Servlet 配置信息。你可以使用这个对象获取 Servlet 名称、Servlet 映射路径等。
  8. page: 这个对象代表当前 JSP 页面。你可以使用这个对象调用其他 JSP 页面、JavaBean 等。
  9. exception: 这个对象用于获取异常信息。当 JSP 页面抛出异常时,你可以使用这个对象获取异常信息。注意,这个对象只能在声明了 "isErrorPage=true" 的页面中使用。这个页面被称为错误页面。

3.说一下 jsp 的 4 种作用域?

JSP的四种作用域分别是page(页面)、request(请求)、session(会话)和 application(应用程序),用于在不同范围内存储和共享数据

JSP有四种作用域,分别是:

  1. pageContext:页面域。页面的作用域仅限于当前页面对象,可以近似地理解为this对象,离开当前Jsp页面,则pageContext中的所有属性就会丢失。
  2. request:请求域。请求作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。 如果通过redirect方式进行页面跳转,由于redirect相当于重新发出请求,此种情境下,request中的属性值会丢失。
  3. session:会话域。会话作用域是在会话的生命周期内,会话失效,则session中的数据也随之丢失。
  4. application:应用域。应用作用域最大,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。

以上信息仅供参考,可以咨询专业的技术人员获取更全面更准确的信息。

4.session 和 cookie 有什么区别?

Session是在服务器端维护的一种状态信息,保存在服务器内存中;Cookie是在客户端维护 的一种状态信息,保存在客户端的浏览器中。

Session和Cookie是两种不同的会话技术,它们有以下区别:

  1. 保存位置:Session保存在服务器端的内存中,而Cookie保存在客户端,通常是浏览器中或者是文件中。
  2. 保存时间:Session在关闭当前会话相关浏览器后自动清空,而Cookie则根据过期时间而有所不同。
  3. 安全性:Session相对较安全,而Cookie如果不进行加密处理则相对不安全,可能会被拦截或被人为清除。
  4. 保存数据大小:Cookie的大小通常受限于浏览器,一般是4K左右,而Session则没有大小限制,取决于服务器的内存大小。
  5. 稳定性:Cookie在客户端,受用户控制,可以被禁用也可以被人为清除,而Session相对较稳定。

综上所述,Session和Cookie各有其特点,需要根据具体的应用场景和需求来选择使用。

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

当客户端发送请求时,服务器为每个客户端创建一个唯一的Session ID,将Session ID保存 在Cookie中或通过URL重写传递给客户端。服务器通过Session ID来查找对应的Session对象,从 而维护客户端会话状态。

Session的工作原理基于HTTP协议的无状态性,即服务器不能记住上一个请求和下一个请求之间的关系。因此,当客户端向服务器发送请求时,服务器会将请求数据存储在服务器端,并给该客户端生成一个唯一的Session ID,并将其通过响应头Set-Cookie返回给客户端。客户端在收到响应后,会将该Session ID存储在浏览器中,以便后续请求时使用。

当客户端再次向服务器发送请求时,会将该Session ID通过请求头Cookie发送到服务器端。服务器端通过检索之前存储的Session ID,找到对应的会话数据,并对其进行处理。这样,服务器端就可以根据Session ID识别不同的客户端,并将相关的请求数据保存在服务器端,从而实现会话的保持。

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

如果客户端禁止了Cookie,仍然可以通过URL重写的方式传递Session ID来实现Session功 能。

如果客户端禁止了cookie,仍然可以通过URL重写的方式传递session ID来实现session功能。在URL重写中,服务器会将session ID作为参数或查询字符串的一部分附加到URL中,以便在后续请求中将其传递给其他页面。客户端在发送请求时,将包含session ID的URL发送到服务器,服务器通过检索session ID来识别客户端,并保持会话的持续性。

然而,使用URL重写实现session功能相对麻烦,且在处理动态网页和表单提交时可能会出现问题。此外,如果客户端使用代理服务器或缓存服务器,则URL重写可能会失效。因此,在大多数情况下,使用cookie来实现session功能更为方便和可靠。

需要注意的是,如果客户端禁止了cookie,则无法使用基于cookie的session机制。在这种情况下,可以考虑使用其他方式来实现会话的保持,例如使用token、SSL证书或HTTP header等方式来传递会话信息。

7.spring mvc 和 struts 的区别是什么

Spring MVC和Struts都是Java Web开发框架,但Spring MVC更加灵活、模块化,支持依赖 注入和AOP;而Struts是基于MVC模式的框架,较老,相对来说更加限制。

Spring MVC和Struts是两个广泛使用的Java Web开发框架,它们有一些重要的区别。以下是它们之间的一些主要差异:

  1. 设计理念:Spring MVC是基于方法的设计,它通过方法形参实现参数传递,并且每个方法可以独立处理请求。而Struts是基于类的设计,通过类的属性接收参数,并且多个方法可以共享这些参数。
  2. 参数传递:Spring MVC的Controller更接近于Service开发,每个方法通常只处理一个请求,并且通过方法的形参接收参数。这种传递方式是单例模式,有助于进行单例开发。而Struts则使用全局变量传递参数,参数可以在多个方法之间共享。
  3. 性能:Spring MVC由于是基于方法的设计和单例模式,因此在性能上通常优于Struts。Struts由于使用全局变量传递参数,可能导致在多实例环境下性能下降。
  4. 开发方式:Spring MVC的入口是Servlet,而Struts的入口是Filter。此外,Spring MVC更接近于Service开发,使得业务逻辑和控制器层的分离更清晰。
  5. 标签使用:Struts因为使用了Struts标签,可能会影响性能。建议在使用Struts时使用JSTL标签。
  6. 测试:Spring MVC可以更好地支持单元测试和集成测试,因为它更接近于Service开发,业务逻辑和控制器层的分离更清晰。

总的来说,Spring MVC和Struts都是强大的Java Web开发框架,它们都有各自的优点和适用场景。选择哪个框架取决于项目的具体需求和开发团队的偏好。

8.如何避免 SQL 注入?

可以使用预编译语句、参数化查询、ORM框架等方式来避免SQL注入,不要直接将用户输 入的数据拼接到SQL语句中。

SQL注入是一种常见的网络安全威胁,攻击者通过在输入字段中插入恶意SQL代码,以试图修改数据库的行为。要避免SQL注入,可以采取以下几种方法:

  1. 使用预编译语句(Prepared Statements)或参数化查询:这种方法可以确保输入被正确地处理,并且不会被解释为SQL代码。在大多数现代编程语言中,都有支持预编译语句的库或函数。
  2. 限制用户的权限:只给予用户必要的权限,以最小化他们能够执行的操作。例如,如果一个用户只需要查询数据,那么就不应该给予他们修改或删除数据的权限。
  3. 输入验证:验证用户输入的数据是否符合预期的格式和类型。例如,如果期望的输入是一个整数,那么任何非数字的输入都应该被拒绝。
  4. 使用Web应用防火墙(WAF):WAF可以检测并阻止SQL注入攻击。
  5. 更新和打补丁:确保你的数据库和编程语言库都是最新的版本,并及时打补丁,以修复已知的安全漏洞。
  6. 安全的错误处理:避免在出现错误时显示敏感信息,这可能会泄露数据库的结构或其它敏感信息。
  7. 最小化显示SQL错误信息:在开发过程中,应尽量减少向用户显示详细的错误信息,特别是与SQL相关的错误信息,以防止攻击者根据错误信息进行SQL注入攻击。
  8. 数据库帐户隔离:对于每一个需要与数据库交互的应用程序,都应该使用独立的数据库帐户。不应该使用具有过高权限的共享帐户。

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

XSS(Cross-Site Scripting)攻击是指攻击者通过在网页中插入恶意脚本,从而窃取用户信 息。可以避免XSS攻击的方法包括对用户输入进行合适的转义、过滤和验证。

XSS攻击即跨站脚本攻击,是一种常见的网络攻击技术。它利用网站没有对用户提交的表单进行过滤和验证的漏洞,通过注入恶意脚本,盗取用户的Cookie、Session ID等敏感信息,甚至可以篡改网页内容,达到攻击的目的。

要避免XSS攻击,可以采取以下几种方法:

  1. 对用户输入进行过滤和验证:对用户输入的数据进行严格的过滤和验证,确保输入的数据符合预期的格式和类型,避免恶意的输入被提交到服务器。
  2. 使用HTTP头部的X-Content-Type-Options:设置X-Content-Type-Options为nosniff,可以防止浏览器在处理响应时对MIME类型进行嗅探,从而避免潜在的XSS攻击。
  3. 启用内容安全策略(CSP):CSP可以限制浏览器加载哪些资源,从而防止恶意脚本的注入和执行。通过设置合适的CSP策略,可以有效防止XSS攻击。
  4. 使用安全的编码实践:在编写Web应用程序时,应该遵循安全的编码实践,避免将用户提交的输入直接嵌入到HTML页面中,而是使用安全的编码函数对输入进行处理,例如使用HTML实体编码函数对特殊字符进行编码。
  5. 更新和打补丁:及时更新Web应用程序和相关库的版本,并及时打补丁,以修复已知的安全漏洞。
  6. 限制用户的权限:只给予用户必要的权限,以最小化他们能够执行的操作。例如,如果一个用户只需要查询数据,那么就不应该给予他们修改或删除数据的权限。
  7. 输入验证:验证用户输入的数据是否符合预期的格式和类型。例如,如果期望的输入是一个整数,那么任何非数字的输入都应该被拒绝。
  8. 使用Web应用防火墙(WAF):WAF可以检测并阻止XSS攻击。

总之,避免XSS攻击需要采取多种措施来保护Web应用程序的安全。这些措施包括对用户输入进行过滤和验证、使用安全的编码实践、更新和打补丁、限制用户的权限、输入验证等。同时,还可以使用Web应用防火墙等安全设备来增强Web应用程序的保护能力。

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

CSRF(Cross-Site Request Forgery)攻击是指攻击者通过欺骗用户在未经授权的情况下执 行操作。可以通过使用验证码、检查Referer头、使用Token验证等方式来避免CSRF攻击。

CSRF(Cross-Site Request Forgery)攻击是一种网络安全威胁,攻击者通过伪装来自受信任的用户的请求来攻击受信任的网站。CSRF攻击利用web中用户身份认证验证的一个漏洞:简答的身份验证仅仅可以保证请求发自某一个用户的浏览器,却无法保证请求本身是用户资源发出的。

要避免CSRF攻击,可以采取以下几种方法:

  1. 使用安全框架:例如Spring Security等,这些框架提供了内置的CSRF防护机制。
  2. 在HTTP请求中进行token验证:如果请求中没有token或者token内容不正确,则认为CSRF攻击而拒绝该请求。
  3. 验证码:验证码能够很好的遏制CSRF攻击,但是很多情况下,出于用户体验考虑,验证码只能作为一种辅助手段,而不是最主要的解决方案。
  4. Referer识别:在HTTP Header中有一个字段Referer,它记录了HTTP请求的来源地址。如果Referer是其他网站,就有可能是CSRF攻击,则拒绝该请求。但是,服务器并非都能取到Referer。很多用户出于隐私保护的考虑,限制了Referer的发送。在某些情况下,浏览器也不会发送Referer,例如HTTPS跳转到HTTP。
  5. 开启session同步:在多个系统之间同步session,确保攻击者无法通过伪造请求来获取用户的session信息。
  6. 使用CSRF令牌:为每个用户生成一个唯一的CSRF令牌,将其添加到每个表单中,并验证每个请求中的CSRF令牌是否正确。
  7. 验证请求源:确保请求来自合法的源。检查请求的IP地址、User-Agent等信息是否与预期相符。
  8. 使用HTTP Only Cookie:设置HTTP Only属性可以防止跨站脚本访问该Cookie,从而降低被CSRF攻击的风险。
  9. 确保前后端安全措施同步:后端和前端都需要采取相应的安全措施,如使用token、检查referer等,确保整个系统的安全性。

总之,避免CSRF攻击需要采取多种措施来保护Web应用程序的安全。这些措施包括使用安全框架、进行token验证、验证码、Referer识别、开启session同步、使用CSRF令牌、验证请求源等。同时,需要确保前后端安全措施同步,才能全面提升Web应用程序的安全性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值