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。

相关推荐
kimnoic6 小时前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
别动我齐刘海7 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
必须得开心呀7 小时前
python编写带界面的软件,需要安装哪些插件
开发语言·python
code2cat8 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe8 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码8 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
考研保研资料分享8 小时前
新闻传播保研经验:中传预推免面试、广告学代表作与实习准备(2025)
面试·职场和发展
wewowilling9 小时前
认识微服务
java·运维·微服务·springcloud
代码什么用9 小时前
Java Web 7-10
java·servlet