JAVA面试题大全(五)

1、jsp 和 servlet 有什么区别?

JSP(JavaServer Pages)和 Servlet 都是用于开发动态 Web 应用程序的技术,但它们在功能和使用方式上有一些区别。

Servlet 是一种基于 Java 的 Web 组件,它在服务器端运行,用于处理客户端的请求并生成动态内容。Servlet 可以直接输出 HTML、XML 或其他格式的数据,也可以将请求转发给其他组件进行处理。

JSP 则是一种将 Java 代码嵌入到 HTML 页面中的技术。JSP 页面在被访问时会被服务器解析为 Servlet,并在服务器端执行其中的 Java 代码,然后将生成的动态内容嵌入到 HTML 页面中返回给客户端。

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

JSP(JavaServer Pages)是一种动态网页技术标准,它使用Java语言来创建动态生成的网页。JSP技术允许开发者将网页的表示层与网页的逻辑层分离,即JSP页面本身不包含Java代码,而是将Java代码封装到JSP标签中,从而使得页面的维护和更新变得更加容易。在JSP中,为了简化开发和提高开发效率,定义了一组内置对象,这些对象提供了与请求、响应、会话等操作相关的功能。

以下是JSP中九个内置对象的详细说明及其作用:

  1. request对象

    • 类型:javax.servlet.http.HttpServletRequest
    • 作用:该对象封装了客户端的HTTP请求信息。通过request对象,开发者可以获取请求参数、请求头信息、路径信息等。request对象的作用域限定在一次请求内,也就是说,它在一次请求处理过程中是可见的,但在不同的请求之间是不共享的。
  2. response对象

    • 作用:response对象代表了服务器对客户端的响应。使用response对象,可以设置响应的状态码、响应头信息,以及向客户端发送响应体数据。它的作用域同样限定在当前JSP页面内。
  3. session对象

    • 作用:session对象用于跟踪用户的状态,即存储用户特定的信息,如用户的登录信息或购物车内容。每个用户都有一个独特的session对象,服务器通过session ID来识别不同的用户session。session数据以键值对的形式存储,并且可以存储复杂的对象类型。
  4. application对象

    • 作用:application对象代表了整个Web应用程序的范围,用于存储全局信息,如配置信息、数据库连接等。application对象的生命周期与Web应用程序相同,可以在应用程序的任何地方访问,适合用于存储共享资源。
  5. out对象

    • 作用:out对象是一个输出流,用于向客户端发送响应数据,如HTML页面、文本等。通过out对象,开发者可以控制输出内容以及输出缓冲区的管理。
  6. pageContext对象

    • 作用:pageContext对象提供了对JSP页面上下文的访问,允许开发者获取其他内置对象(如request、response等)、设置页面属性等。pageContext是页面范围的,可以在JSP页面的任何地方使用。
  7. config对象

    • 作用:config对象用于获取JSP页面的配置信息,如初始化参数。这些参数可以在web.xml文件中设置,然后在JSP页面中通过config对象获取。
  8. page对象

    • 作用:page对象代表了JSP页面本身,类似于Java中的this关键字。通过page对象,可以访问JSP页面的属性和方法。
  9. exception对象

    • 作用:exception对象用于异常处理。它只在JSP的错误页面(即页面指令中包含<%@ page isErrorPage="true" %>)中可用。当JSP页面中发生未捕获的异常时,exception对象会被创建并传递到错误页面,开发者可以在错误页面中获取异常信息并进行处理。

通过这些内置对象,JSP页面能够实现对HTTP请求的接收、处理以及响应的发送,同时还能够管理用户的会话状态和应用程序的全局状态,大大提高了Web应用程序的交互性和可维护性。

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

JSP(JavaServer Pages)是一种用于创建动态网页的技术,它提供了四种作用域来管理数据的可见性和生命周期。以下是对这四种作用域的详细解释:

  1. page 作用域:page 作用域是 JSP 页面内的作用域,它只在当前 JSP 页面内有效。在 page 作用域中设置的变量只能在当前页面中访问和使用。一旦页面执行完毕,page 作用域中的变量将被销毁。
  2. request 作用域:request 作用域在一次 HTTP 请求中有效。当用户发送一个请求到 JSP 页面时,JSP 引擎会创建一个新的 request 对象,并将其与该请求关联。在 request 作用域中设置的变量可以在当前请求的所有页面和ervlet 中访问和使用,直到请求结束。
  3. session 作用域:session 作用域在一次会话中有效。会话是指用户与服务器之间的一系列交互过程,它可以跨越多个请求。在 session 作用域中设置的变量可以在整个会话期间共享和访问,直到会话过期或被销毁。
  4. application 作用域:application 作用域在整个 Web 应用程序中有效。当 Web 应用程序启动时,JSP 引擎会创建一个 application 对象,并将其与应用程序关联。在 application 作用域中设置的变量可以在整个应用程序的所有页面和 servlet 中访问和使用,直到应用程序停止。

下面是一个示例,演示了如何在 JSP 中使用这四种作用域:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>JSP 作用域示例</title>
</head>
<body>
    <%
        // 在 page 作用域中设置变量
        pageContext.setAttribute("pageVariable", "这是 page 作用域中的变量");

        // 在 request 作用域中设置变量
        request.setAttribute("requestVariable", "这是 request 作用域中的变量");

        // 在 session 作用域中设置变量
        session.setAttribute("sessionVariable", "这是 session 作用域中的变量");

        // 在 application 作用域中设置变量
        application.setAttribute("applicationVariable", "这是 application 作用域中的变量");
    %>

    <h2>page 作用域中的变量:<%= pageContext.getAttribute("pageVariable") %></h2>
    <h2>request 作用域中的变量:<%= request.getAttribute("requestVariable") %></h2>
    <h2>session 作用域中的变量:<%= session.getAttribute("sessionVariable") %></h2>
    <h2>application 作用域中的变量:<%= application.getAttribute("applicationVariable") %></h2>
</body>
</html>

4、session 和 cookie 有什么区别? 

  • 存储位置不同
    cookie的数据信息存放在客户端浏览器上
    session的数据信息存放在服务器上
  • 存储容量不同
    单个cookie保存的数据<=4Kb,一个站点最多保存20个cookie
    对于session来说没有上限
  • 存储方式不同
    cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据;session中能够存储任何类型的数据
  • 隐私策略不同
    cookie对客户端是可见的,所以它是不安全的;
    session存储在服务器上,对客户端是透明的,不会信息泄露
  • 有效期不同
    可以通过设置cookie的属性,使cookie长期有效;
    session不能达到长期有效的结果
  • 服务器压力不同
    cookie保存在客户端,不占用服务器资源
    session是保存在服务器的,如果并发访问的用户十分多,会产生很多的session,耗费大量的内存
  • 浏览器支持不同
    cookie是需要浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效
    session只能在本窗口以及子窗口有效,而cookie可以为本浏览器上的一切窗口有效
  • 跨域支持不同
    cookie支持跨域名访问
    session不支持跨域名访问

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

session 的工作原理主要包括以下几个步骤:

  1. 创建 session 对象:当客户端第一次访问服务器时,服务器会创建一个 session 对象,并为该对象分配一个唯一的 session ID。
  2. 发送 session ID:服务器将 session ID 以 cookie 的形式发送给客户端。客户端会将 cookie 存储在本地,并在后续的请求中自动携带该 cookie。
  3. 跟踪客户端状态:服务器根据客户端携带的 session ID 找到对应的 session 对象,从而可以获取客户端的状态信息,如登录状态、购物车内容等。
  4. 存储和更新 session 数据:服务器可以将客户端的状态信息存储在 session 对象中,并在需要时进行更新。
  5. 销毁 session 对象:当客户端长时间未与服务器交互时,服务器会自动销毁对应的 session 对象,以释放资源。

通过这种方式,session 实现了对客户端状态的跟踪和管理,使得服务器可以为不同的客户端提供个性化的服务。

需要注意的是,session 依赖于 cookie 来传递 session ID,如果客户端禁用了 cookie,那么 session 将无法正常工作。在这种情况下,可以通过 URL 重写等技术来传递 session ID。

6、如果客户端禁止 cookie,session 还能用吗? 

如果客户端禁止了 Cookie,Session 仍然可以使用,但是需要使用其他方式来传递 Session ID。 一种常见的解决方案是使用 URL 重写技术。在这种情况下,服务器会在每个 URL 后面添加一个包含 Session ID 的参数。例如,如果原始 URL 是`http://example.com/page.jsp`,那么服务器可能会将其重写为`http://example.com/page.jsp;jsessionid=123456`。 另一种解决方案是将 Session ID 存储在隐藏的表单字段中。在这种情况下,服务器会在页面中添加一个隐藏的表单字段,其中包含 Session ID。当用户提交表单时,Session ID 会随表单数据一起发送到服务器。 需要注意的是,使用 URL 重写或隐藏表单字段来传递 Session ID 可能会带来一些安全风险,因为这些信息可能会被恶意用户窃取或篡改。因此,在使用这些技术时,应该采取适当的安全措施来保护 Session ID 的安全性。

7、spring mvc 和 struts 的区别是什么?

Spring MVC 和 Struts 都是用于开发 Web 应用程序的框架,但它们在设计理念、配置方式和性能等方面存在一些区别。

  1. 设计理念

    • Spring MVC 是基于 Spring 框架的,强调松耦合和面向接口编程。它将模型、视图和控制器分离,使得开发人员可以更灵活地组织和管理代码。
    • Struts 则是一个独立的框架,强调 Action 类的使用。它通过继承和实现特定的接口来实现框架的功能。
  2. 配置方式

    • Spring MVC 使用基于 Java 的配置方式,可以通过注解或 XML 文件来配置框架的各个组件。这种配置方式更加简洁和灵活。
    • Struts 使用 XML 文件来配置框架的组件,包括 Action、Result 等。配置文件相对较为复杂,并且需要开发者对 Struts 的配置语法有一定的了解。
  3. 性能

    • Spring MVC 在性能方面表现出色,尤其是在处理大量请求时。它的核心机制是基于DispatcherServlet,通过反射机制来调用相应的控制器方法,因此具有较高的效率。
    • Struts 的性能相对较弱,特别是在处理大量请求时可能会出现性能瓶颈。这是因为 Struts 的核心机制是基于 ActionServlet,通过多线程来处理请求,可能会导致线程安全问题。
  4. 社区和生态系统

    • Spring 框架拥有广泛的社区支持和丰富的生态系统,包括众多的扩展和插件。这使得开发人员可以更容易地找到解决方案和资源。
    • Struts 的社区相对较小,但其仍然有一定的用户群体和资源可供使用。

综上所述,Spring MVC 和 Struts 都有各自的特点和优势,选择哪个框架取决于具体的项目需求和开发团队的技术偏好。如果项目需要更灵活的配置和更好的性能,Spring MVC 可能是更好的选择;如果项目对 Struts 有较高的熟悉度或有特定的需求,Struts 也可以是一个合适的选择。

8、如何避免 sql 注入? 

SQL注入是Web开发中最常见的一种安全漏洞,可以用它来从数据库获取敏感信息,进行数据库的一系列非法操作。

  • 校验参数的数据格式是否合法
  • 对进入数据库的特殊字符进行转义处理,或编码转换
  • 预编译SQL,参数化查询方式,避免SQL拼接
  • 发布前利用工具进行SQL注入检测

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

XSS 攻击是一种跨站脚本攻击,它是指攻击者通过在网页中注入恶意脚本,从而在用户的浏览器中执行恶意代码的攻击方式。XSS 攻击可以窃取用户的会话信息、篡改网页内容、执行恶意操作等,对用户的隐私和安全造成严重威胁。

为了避免 XSS 攻击,可以采取以下几种措施:

  1. 对用户输入进行严格的验证和过滤:在接收用户输入时,应该对输入进行严格的验证和过滤,确保输入的数据符合预期的格式和范围。例如,对于用户输入的文本,应该过滤掉其中的 HTML 标签和特殊字符,以防止恶意脚本的注入。
  2. 对输出进行编码:在输出用户输入时,应该对输出进行编码,以防止恶意脚本的执行。例如,对于用户输入的文本,应该将其中的 HTML 标签和特殊字符进行转义,以防止它们被浏览器解释为恶意脚本。
  3. 使用 CSP:CSP(Content Security Policy)是一种用于限制网页内容来源的安全策略。通过设置 CSP,可以限制网页中可以加载的脚本、样式表、图片等资源的来源,从而防止恶意脚本的注入。
  4. 使用 HttpOnly 属性:对于包含敏感信息的 cookie,应该设置 HttpOnly 属性,以防止恶意脚本通过 JavaScript 访问这些 cookie。
  5. 定期更新和维护:定期更新和维护网站的代码和依赖库,以确保它们没有已知的安全漏洞。

总之,XSS 攻击是一种常见的 Web 应用安全漏洞,它可以对用户的隐私和安全造成严重威胁。为了避免 XSS 攻击,应该采取以上几种措施,同时加强对网站的安全管理和监控,及时发现和处理安全漏洞。

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

CSRF(Cross-Site Request Forgery)攻击是一种针对 Web 应用程序的攻击方式,它利用用户已登录的身份,在用户不知情的情况下,以用户的名义执行非法操作。例如,攻击者可以构造一个恶意的链接,发送给已经登录的用户,当用户点击该链接时,就会以用户的名义执行一些敏感操作,如修改密码、转账等。

为了避免 CSRF 攻击,可以采取以下几种措施:

  1. 使用 CSRF 令牌:CSRF 令牌是一种用于防止 CSRF 攻击的机制。在用户发送请求时,服务器会生成一个随机的 CSRF 令牌,并将其发送给客户端。客户端在发送请求时,需要将 CSRF 令牌作为请求的一部分发送给服务器。服务器在接收到请求时,会验证 CSRF 令牌的有效性,如果令牌无效,则拒绝请求。
  2. 检查 Referer 字段:Referer 字段是 HTTP 请求头中的一个字段,它记录了请求的来源地址。服务器可以通过检查 Referer 字段来判断请求是否来自合法的来源。如果请求的来源地址与预期不符,则可以拒绝请求。
  3. 设置 SameSite 属性:SameSite 属性是 HTTP 响应头中的一个属性,它用于指定 Cookie 是否可以在跨站请求中发送。通过设置 SameSite 属性为“Strict”或“Lax”,可以限制 Cookie 在跨站请求中的发送,从而防止 CSRF 攻击。
  4. 限制请求方法:对于一些敏感的操作,如修改密码、转账等,可以限制其请求方法为 POST。这样可以防止攻击者通过 GET 请求来执行非法操作。
  5. 对用户进行身份验证:对于一些敏感的操作,如修改密码、转账等,可以要求用户再次输入密码或进行其他身份验证操作,以确保用户的身份合法。

总之,CSRF 攻击是一种常见的 Web 应用程序安全漏洞,它可以对用户的隐私和安全造成严重威胁。为了避免 CSRF 攻击,开发人员应该采取以上几种措施,同时加强对 Web 应用程序的安全管理和监控,及时发现和处理安全漏洞。

 

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值