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。

相关推荐
karry_k4 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k4 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
SamDeepThinking8 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
用户852495071848 小时前
解密 JavaScript 中的 this:谁才是真正的调用者?
javascript·面试
Heo8 小时前
Vite进阶用法详解
前端·javascript·面试
洛卡卡了8 小时前
Claude Code rules 要怎么用,团队协作时如何统一代码规范呢?
面试·agent·claude
她的男孩11 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
不好听61312 小时前
JavaScript 的 this 到底指向谁?
javascript·面试
烬羽12 小时前
面试官:聊聊 LocalStorage 和 this 指向?看这篇就够了
面试·程序员