java面试基础2

简述ServletContext生命周期

ServletContext 代表整个 Web 应用的环境对象 ,它的生命周期和Web 应用完全一致

  1. 创建 Web 应用启动时 (服务器启动 / 项目部署),服务器自动创建 ServletContext 对象,全局唯一

  2. 存活 整个 Web 应用运行期间,该对象一直存在,所有 Servlet 共享使用。

  3. 销毁 Web 应用关闭时(服务器关闭 / 项目卸载),服务器销毁 ServletContext 对象,释放资源。

转发与重定向的比较

本质区别

  • 转发request.getRequestDispatcher("地址").forward(request,response);服务器内部跳转,一次请求
  • 重定向response.sendRedirect("地址");告诉浏览器重新发请求,两次请求
  1. 地址栏
  • 转发:地址栏不变

  • 重定向:地址栏变成目标地址

  1. 数据共享
  • 转发:可以共享 request 域数据

  • 重定向:不共享 request 数据

  1. 跳转范围
  • 转发:只能跳转到本项目内部资源

  • 重定向:可以跳转到外部网站

  1. 效率
  • 转发:效率高

  • 重定向:效率低

session的原理

  • 客户端第一次请求服务器时,服务器创建 Session 对象 ,并生成唯一的 JSESSIONID
  • 服务器以 Cookie 形式把 JSESSIONID 发给浏览器保存。
  • 后续每次请求,浏览器都会自动携带这个 JSESSIONID。
  • 服务器根据 JSESSIONID 找到对应的 Session,实现会话状态保持
  • Session 保存在服务器端,安全;JSESSIONID 存在客户端浏览器。
  1. 存储位置不同

    • Cookie 存放在客户端浏览器
    • Session 存放在服务器端
  2. 安全性不同

    • Cookie 不安全,容易被查看、篡改
    • Session 更安全,数据在服务器
  3. 存储大小不同

    • Cookie 大小有限制(一般几 KB)
    • Session 存储容量更大
  4. 存储类型不同

    • Cookie 只能存字符串
    • Session 可以存对象
  5. 生命周期

    • Cookie 可长期保存(设置过期时间)
    • Session 默认会话结束(关闭浏览器)失效,也可设置超时时间
  6. 服务器压力

    • Cookie 不占服务器资源
    • Session 过多会占用服务器资源

JSP和Servlet是什么关系

  1. 本质关系 JSP 本质上就是 Servlet,是 Servlet 的一种特殊形式。

  2. 运行原理

  • 浏览器访问 JSP → 服务器先把 JSP 翻译成 Java 源码
  • 再编译成 class 文件
  • 最终运行的还是一个 Servlet

3.分工不同

  • Servlet :擅长处理逻辑、控制流程(后台)
  • JSP :擅长页面展示、输出 HTML(前端)

JSP的九大隐式对象是哪九个

对象名 类型 作用
request HttpServletRequest 请求对象,获取客户端请求信息(参数、头信息等)。
response HttpServletResponse 响应对象,设置响应内容、头信息、重定向等。
session HttpSession 会话对象,存储与用户会话相关的数据,生命周期关联浏览器会话。
application ServletContext 应用对象,代表整个 Web 应用,全局唯一,用于存储应用级数据。
对象名 类型 作用
out JspWriter 输出对象 ,用于向客户端输出内容,相当于 response.getWriter()
pageContext PageContext 页面上下文对象,获取页面所有属性、请求 / 会话 / 应用域对象,管理页面资源。
对象名 类型 作用
exception Throwable 异常对象 ,仅在 错误页面isErrorPage="true")中可用,存储异常信息。
page Object 页面对象 ,代表当前 JSP 页面本身,等价于 this 关键字,很少使用。
config ServletConfig 配置对象,获取当前 JSP/Servlet 的初始化配置信息。

如何防止SQL注入攻击

  1. 使用预编译语句(PreparedStatement) 这是最核心、最有效 的方案。通过占位符 ? 传递参数,SQL 结构与参数分离,从根本上杜绝注入。

  2. 使用 MyBatis/Hibernate 等 ORM 框架 框架底层自动使用预编译,只需使用 #{} 而非 ${}

    • #{}:预编译,安全
    • ${}:字符串拼接,有注入风险
  3. 对用户输入进行校验过滤 过滤 or、and、union、select、delete、-- 等敏感关键字。

  4. 权限最小化数据库账号只赋予必要权限,不授予删表、删库等高风险权限。

  5. 避免拼接 SQL 语句严禁直接用字符串拼接方式把用户输入拼进 SQL。

相关推荐
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【30】Nacos Skill Registry 的底层设计与实现
java·人工智能·spring
北辰屿风2 小时前
宝塔部署tomcat项目,nginx负载均衡代理访问报错404问题
java·tomcat
鱼鳞_2 小时前
Java学习笔记_Day37(网络编程)
java·网络·笔记·学习
Metaphor6922 小时前
使用 Python 合并 PDF 文件
java·python·pdf
我是无敌小恐龙2 小时前
Java SE 零基础入门Day03 数组核心详解(定义+内存+遍历+算法+实战案例)
java·开发语言·数据结构·人工智能·算法·aigc·动态规划
甘露寺2 小时前
深入理解并发模型:从 Python 的 async/await 到 Java 的虚拟线程与线程池机制
java·开发语言·网络
郝学胜-神的一滴2 小时前
深入理解 epoll_wait:高性能 IO 多路复用核心解密
linux·服务器·开发语言·c++·网络协议
HAWK eoni2 小时前
java进阶1——JVM
java·开发语言·jvm