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。

相关推荐
两年半的个人练习生^_^13 分钟前
JMM 进阶:彻底理解 volatile 实现原理
java·开发语言
Raink老师15 分钟前
【AI面试临阵磨枪-91】Skill 市场 / Hub 设计:审核、上架、评分、更新、安全扫描?
人工智能·安全·面试
晚风吹红霞15 分钟前
C++模板进阶:非类型参数、特化、分离编译与优缺点解析
开发语言·c++
Yeats_Liao16 分钟前
Java网络编程(五):Selector选择器与高并发实现
java·后端·架构
小小龙学IT21 分钟前
Go语言后端开发入门指南
开发语言·后端·golang
不会C语言的男孩22 分钟前
C++ Primer 第8章:IO 库
开发语言·c++
AC赳赳老秦23 分钟前
OpenClaw任务复盘自动化:统计每日完成工作、遗留问题,优化工作节奏
java·大数据·linux·运维·服务器·数据库·openclaw
兰令水30 分钟前
leecodecode【层序遍历】【2026.6.3打卡-java版本】
java·开发语言
Halo_tjn31 分钟前
反射与设计模式2
java·开发语言·算法
YDS82932 分钟前
DeepSeek RAG&MCP + Agent智能体项目 —— 动态决策策略的接口对接
java·spring boot·ai·agent·spring ai·deepseek