简述ServletContext生命周期
ServletContext 代表整个 Web 应用的环境对象 ,它的生命周期和Web 应用完全一致:
-
创建 Web 应用启动时 (服务器启动 / 项目部署),服务器自动创建 ServletContext 对象,全局唯一。
-
存活 整个 Web 应用运行期间,该对象一直存在,所有 Servlet 共享使用。
-
销毁 Web 应用关闭时(服务器关闭 / 项目卸载),服务器销毁 ServletContext 对象,释放资源。
转发与重定向的比较
本质区别
- 转发 :
request.getRequestDispatcher("地址").forward(request,response);服务器内部跳转,一次请求 - 重定向 :
response.sendRedirect("地址");告诉浏览器重新发请求,两次请求
- 地址栏
-
转发:地址栏不变
-
重定向:地址栏变成目标地址
- 数据共享
-
转发:可以共享 request 域数据
-
重定向:不共享 request 数据
- 跳转范围
-
转发:只能跳转到本项目内部资源
-
重定向:可以跳转到外部网站
- 效率
-
转发:效率高
-
重定向:效率低
session的原理
- 客户端第一次请求服务器时,服务器创建 Session 对象 ,并生成唯一的 JSESSIONID。
- 服务器以 Cookie 形式把 JSESSIONID 发给浏览器保存。
- 后续每次请求,浏览器都会自动携带这个 JSESSIONID。
- 服务器根据 JSESSIONID 找到对应的 Session,实现会话状态保持。
- Session 保存在服务器端,安全;JSESSIONID 存在客户端浏览器。
Cookie 与 Session 的区别
-
存储位置不同
- Cookie 存放在客户端浏览器
- Session 存放在服务器端
-
安全性不同
- Cookie 不安全,容易被查看、篡改
- Session 更安全,数据在服务器
-
存储大小不同
- Cookie 大小有限制(一般几 KB)
- Session 存储容量更大
-
存储类型不同
- Cookie 只能存字符串
- Session 可以存对象
-
生命周期
- Cookie 可长期保存(设置过期时间)
- Session 默认会话结束(关闭浏览器)失效,也可设置超时时间
-
服务器压力
- Cookie 不占服务器资源
- Session 过多会占用服务器资源
JSP和Servlet是什么关系
-
本质关系 JSP 本质上就是 Servlet,是 Servlet 的一种特殊形式。
-
运行原理
- 浏览器访问 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注入攻击
-
使用预编译语句(PreparedStatement) 这是最核心、最有效 的方案。通过占位符
?传递参数,SQL 结构与参数分离,从根本上杜绝注入。 -
使用 MyBatis/Hibernate 等 ORM 框架 框架底层自动使用预编译,只需使用
#{}而非${}。#{}:预编译,安全${}:字符串拼接,有注入风险
-
对用户输入进行校验过滤 过滤
or、and、union、select、delete、--等敏感关键字。 -
权限最小化数据库账号只赋予必要权限,不授予删表、删库等高风险权限。
-
避免拼接 SQL 语句严禁直接用字符串拼接方式把用户输入拼进 SQL。