第72篇:JavaWeb面试高频题(2026版)
📌 系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第71篇:HTTP协议详解 |
➡️ 下一篇:第73篇:Spring IoC容器
🗺️ 本文阅读地图(3 分钟速览)
第68~71篇搞定了Servlet、JSP/EL、Cookie/Session、HTTP协议,本篇是 JavaWeb专题的收官之作——把专题中所有高频面试考点集中梳理,形成一份完整的面试突击清单:
| 模块 | 核心问题 | 一句话回答 |
|---|---|---|
| 转发 vs 重定向 | 两者有什么区别? | 转发是服务器内部行为(1次请求),重定向是客户端行为(2次请求) |
| getParameter vs getAttribute | 两个方法怎么选? | getParameter拿客户端参数(String),getAttribute拿服务端属性(Object) |
| Filter vs Interceptor | 过滤器和拦截器有什么区别? | Filter是Servlet规范(回调函数),Interceptor是Spring特有(反射/AOP) |
| Servlet生命周期 | Servlet从生到死经历什么? | 加载→实例化→初始化(init)→服务(service)→销毁(destroy) |
| JSP vs Servlet | 两者什么关系? | JSP本质就是Servlet,JSP侧重视图,Servlet侧重控制逻辑 |
| JSP九大内置对象 | 有哪些可以直接用? | request/response/out/session/application/pageContext/config/page/exception |
| JSP四大作用域 | 数据存在哪里? | page < request < session < application |
| 跨域是什么?怎么解决? | 前后端分离必考题 | 浏览器同源策略限制,主流方案CORS |
| Web安全 | 常见攻击与防护? | XSS、CSRF、SQL注入三大威胁 |
一、核心知识点
1. JavaWeb面试考什么?
JavaWeb是Java后端开发的地基。无论你用Spring Boot还是微服务,底层都跑在Servlet容器上,都基于HTTP协议通信。面试官考JavaWeb,本质是在考三件事:
- 你懂不懂底层原理——Servlet怎么工作的?HTTP请求怎么处理的?
- 你清不清楚关键区别——转发和重定向什么区别?Filter和Interceptor什么区别?
- 你有没有踩坑经验——Session共享怎么解决?跨域怎么处理?
💡 面试真相:面试官问JavaWeb,不是为了考你背八股文,而是想确认——你写的代码出了问题,能不能快速定位到是Web层的哪个环节出了问题。
2. 高频考点全景图

二、通俗讲解(1分钟开心学)
把JavaWeb面试想象成"餐厅后厨面试"
- HTTP协议:你和顾客之间的"对话规则"——说什么、怎么说
- Servlet:后厨的"总厨"——接单、分配任务、出菜
- Filter(过滤器) :后厨门口的"安检员"——所有进后厨的都要过一遍(编码、日志、权限)
- Interceptor(拦截器) :灶台前的"质检员"——只检查要下锅的菜(Controller层的请求)
- 转发(Forward) :总厨内部派活——“小王,这个单你来做”(URL不变)
- 重定向(Redirect) :总厨让顾客去隔壁窗口——“这个窗口不做,你去隔壁”(URL变了)
- Cookie:顾客手里的"取餐号"小票
- Session:后厨的"订单记录本"——按取餐号查订单详情
三、核心对比题(面试必考)
3.1 转发(Forward)vs 重定向(Redirect)
这是JavaWeb面试中出现频率最高的对比题之一。
| 对比维度 | 转发(Forward) | 重定向(Redirect) |
|---|---|---|
| 本质 | 服务器内部行为 | 客户端行为 |
| 请求次数 | 1次请求 | 2次请求 |
| URL变化 | 不变 | 改变 |
| 数据共享 | 共享同一个request | 不共享(两次请求不同request) |
| 速度 | 更快 | 较慢 |
| 使用场景 | 转发到JSP展示数据 | 登录后跳转、表单提交后重定向 |
代码示例:
// 转发(Forward)—— 服务器内部跳转
request.getRequestDispatcher("/success.jsp").forward(request, response);
// 重定向(Redirect)—— 客户端跳转
response.sendRedirect("/login.jsp");
💡 记忆口诀:转发是"内部调岗"(URL不变、1次请求、数据共享),重定向是"顾客去隔壁窗口"(URL变了、2次请求、数据不共享) 。
3.2 getParameter() vs getAttribute()
这是笔试题常客,两个方法都在HttpServletRequest上,但用途完全不同。
| 对比维度 | getParameter() | getAttribute() |
|---|---|---|
| 数据来源 | 客户端(POST/GET传递的参数) | 服务端(通过setAttribute设置的属性) |
| 返回值类型 | String | Object |
| 是否需要先set | 不需要,直接拿客户端传过来的 | 需要,必须先setAttribute再get |
| 有无set方法 | 无setParameter()方法 | 有setAttribute()方法 |
| 典型场景 | 获取表单提交的数据、URL参数 | Servlet向JSP传递数据 |
代码示例:
// getParameter —— 拿客户端传过来的参数
String username = request.getParameter("username"); // 从 ?username=zhangsan 获取
// getAttribute —— 拿服务端存进去的数据
request.setAttribute("user", user); // 先存
User user = (User) request.getAttribute("user"); // 再取
💡 记忆口诀:Parameter是"顾客递进来的"(String),Attribute是"后厨自己存的"(Object) 。
3.3 Filter(过滤器)vs Interceptor(拦截器)
这是区分Servlet容器和Spring框架理解深度的关键题。
| 对比维度 | Filter(过滤器) | Interceptor(拦截器) |
|---|---|---|
| 技术归属 | Servlet规范(Java EE/Jakarta EE) | Spring MVC框架特有 |
| 实现原理 | 基于函数回调(回调机制) | 基于Java反射机制(AOP动态代理) |
| 是否依赖容器 | 依赖Servlet容器(Tomcat等) | 不依赖Servlet容器 |
| 作用范围 | 几乎所有的请求(包括静态资源) | 只对Controller的请求起作用 |
| 执行时机 | Servlet容器层面,先于Interceptor执行 | Spring MVC层面,在Filter之后执行 |
| 核心方法 | doFilter() | preHandle() / postHandle() / afterCompletion() |
执行顺序图:
请求 → Filter.doFilter() → Interceptor.preHandle() → Controller
↓
响应 ← Filter.doFilter() ← Interceptor.afterCompletion() ← 视图渲染
↑
Interceptor.postHandle()(视图渲染前)
💡 记忆口诀:Filter是"门卫"(所有请求都要过),Interceptor是"专检"(只查Controller的请求) 。
3.4 JSP vs Servlet
| 对比维度 | Servlet | JSP |
|---|---|---|
| 本质 | Java类 | 本质上就是Servlet(被翻译成Servlet) |
| 代码形式 | 纯Java代码 | HTML + Java混合 |
| MVC角色 | Controller(控制器) | View(视图) |
| 适合场景 | 业务逻辑处理 | 页面展示 |
四、高频独立题
4.1 Servlet生命周期
Servlet有良好的生存期定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由
init()、service()、destroy()三个方法表达。
五个阶段:
| 阶段 | 方法 | 执行次数 | 说明 |
|---|---|---|---|
| ① 加载与实例化 | 构造函数 | 1次 | 容器加载Servlet类,创建实例 |
| ② 初始化 | init() | 1次 | 初始化准备工作 |
| ③ 服务 | service() | 多次 | 处理客户端请求,根据请求方法调用doGet/doPost |
| ④ 销毁 | destroy() | 1次 | 容器关闭时释放资源 |
💡 实例化时机:Servlet默认是懒加载——第一次访问时才实例化。如果在
web.xml中配置了<load-on-startup>正数,则在容器启动时实例化。
4.2 JSP九大内置对象
JSP在被翻译成Servlet时,容器自动创建了9个内置对象,开发者可以直接使用:
| 对象名 | 类型 | 作用 |
|---|---|---|
request | HttpServletRequest | 封装客户端请求 |
response | HttpServletResponse | 封装服务器响应 |
out | JspWriter | 输出响应内容 |
session | HttpSession | 用户会话数据 |
application | ServletContext | 全局应用数据 |
pageContext | PageContext | 获取其他对象、操作域 |
config | ServletConfig | Servlet配置信息 |
page | Object | 当前JSP页面本身(相当于this) |
exception | Throwable | 异常信息(仅错误页面可用) |
4.3 JSP四大作用域
数据存储的"四个抽屉",范围从小到大:
| 作用域 | 对象 | 生命周期 | 使用场景 |
|---|---|---|---|
| page | pageContext | 当前页面 | 页面内临时数据 |
| request | request | 一次请求 | 请求间传递数据 |
| session | session | 一次会话 | 用户登录状态、购物车 |
| application | application | 整个应用 | 全局配置、统计数据 |
💡 查找顺序:page → request → session → application,从小到大。
4.4 跨域问题与解决方案
什么是跨域?
浏览器同源策略限制——协议、域名、端口任意一个不同,就是跨域,浏览器会拦截前端异步请求。
主流解决方案:
| 方案 | 说明 | 推荐度 |
|---|---|---|
| CORS(跨域资源共享) | 后端配置响应头,允许指定来源访问 | ⭐⭐⭐⭐⭐ 首选 |
| 网关统一跨域 | 在网关层统一配置CORS | ⭐⭐⭐⭐ |
| 前端代理 | 开发环境用Webpack代理转发 | ⭐⭐⭐ |
| JSONP | 仅支持GET请求,已过时 | ⭐ |
Spring Boot中配置CORS:
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true);
}
};
}
}
4.5 Web安全三大威胁
| 攻击类型 | 原理 | 防护措施 |
|---|---|---|
| XSS(跨站脚本攻击) | 注入恶意JavaScript脚本 | 输入过滤、输出转义、CSP防护 |
| CSRF(跨站请求伪造) | 伪造用户请求 | Token校验、Referer校验 |
| SQL注入 | 拼接恶意SQL语句 | 预编译SQL(PreparedStatement)、参数绑定 |
💡 防SQL注入铁律:永远不要用字符串拼接的方式写SQL,永远使用
PreparedStatement。
五、避坑要点
| 错误/误区 | 后果 | 正确做法 |
|---|---|---|
| 用重定向传递数据 | 数据丢失(两次请求request不同) | 用转发共享数据,或用Session/URL参数 |
| 混淆getParameter和getAttribute | 取不到值或类型转换异常 | 客户端参数用getParameter,服务端属性用getAttribute |
| 认为Filter和Interceptor可以互换 | 功能范围错配 | 全局通用逻辑用Filter,Controller专属用Interceptor |
| 生产环境不配置CORS | 前端无法调用接口 | 正确配置CORS允许指定来源 |
| 忽略SQL注入风险 | 数据库被拖库 | 永远用PreparedStatement |
| 分布式部署仍用内存Session | 用户频繁被登出 | 改用Spring Session + Redis |
六、面试高频考点(20问速查)
| 编号 | 面试题 | 核心答案(关键词) | 详见 |
|---|---|---|---|
| 1 | HTTP和HTTPS的区别? | 明文 vs 加密、80 vs 443、无证书 vs 有证书 | 第71篇 |
| 2 | GET和POST的区别? | 参数在URL vs Body、有大小限制 vs 无限制 | 第71篇 |
| 3 | 转发(Forward)和重定向(Redirect)的区别? | 1次请求 vs 2次、URL不变 vs 变、数据共享 vs 不共享 | 本文 |
| 4 | getParameter()和getAttribute()的区别? | String vs Object、客户端 vs 服务端 | 本文 |
| 5 | Filter和Interceptor的区别? | Servlet规范 vs Spring、回调 vs 反射/AOP | 本文 |
| 6 | Servlet的生命周期? | 加载→实例化→init→service→destroy | 本文 |
| 7 | JSP的本质是什么? | 本质上就是Servlet | 第69篇 |
| 8 | JSP的九大内置对象有哪些? | request/response/out/session/application/pageContext/config/page/exception | 第69篇 |
| 9 | JSP的四大作用域? | page < request < session < application | 第69篇 |
| 10 | Cookie和Session的区别? | 客户端 vs 服务端、不安全 vs 安全 | 第70篇 |
| 11 | 禁用Cookie后Session还能用吗? | 能,URL重写 | 第70篇 |
| 12 | 分布式Session怎么解决? | Spring Session + Redis | 第70篇 |
| 13 | JWT和Session怎么选? | 需要踢人下线用Session,不需要主动作废用JWT | 第70篇 |
| 14 | 什么是跨域?怎么解决? | 同源策略限制、CORS是主流方案 | 本文 |
| 15 | XSS攻击是什么?怎么防? | 注入恶意脚本、输入过滤+输出转义 | 本文 |
| 16 | CSRF攻击是什么?怎么防? | 伪造用户请求、Token校验 | 本文 |
| 17 | SQL注入怎么防? | PreparedStatement预编译 | 本文 |
| 18 | Tomcat是什么? | Web应用服务器 | 第68篇 |
| 19 | Tomcat如何创建Servlet实例? | 反射机制实例化 | 第68篇 |
| 20 | 什么是会话(Session)? | 客户端与服务器的不中断请求响应序列 | 第70篇 |
🎤 面试官追问陷阱(加分题)
追问1:“既然转发比重定向快,为什么登录成功后不都用转发?”
👉 这是一个典型的"陷阱题"。转发虽然快,但刷新页面会重复提交表单——用户登录后F5刷新,转发会再次执行登录逻辑,可能造成重复提交。重定向虽然慢一点,但刷新页面只是重新请求跳转后的页面,不会重复提交。这就是Post/Redirect/Get(PRG)模式——表单提交后用重定向,避免重复提交。
追问2:“Filter能做的事,Interceptor都能做吗?”
👉 不能。Filter工作在Servlet容器层面,能拦截所有请求(包括静态资源如CSS、JS、图片)。Interceptor只工作在Spring MVC层面,只能拦截进入Controller的请求。如果需要做全局的字符编码过滤、跨域处理、静态资源访问控制,必须用Filter。如果只需要在Controller方法前后做日志、权限校验,用Interceptor更合适。
追问3:“getParameter()能拿到POST请求的JSON数据吗?”
👉 不能。
getParameter()只能获取application/x-www-form-urlencoded格式的参数(表单提交和URL参数)。如果POST请求的Content-Type是application/json,需要用@RequestBody或通过request.getInputStream()手动读取。这是很多初学者容易踩的坑。
七、练习题
-
简答题:转发(Forward)和重定向(Redirect)在请求次数、URL变化、数据共享三个方面有什么区别?
-
代码题:写一个Filter,实现所有请求的字符编码统一为UTF-8。
-
分析题:用户登录成功后跳转到首页,刷新页面发现"重复提交"警告。请分析原因并给出解决方案。
📊 你的学习进度
- 当前:第72篇 / 共108篇 · 进阶篇:JavaWeb核心技术(第68~72篇)✅ 专题收官
- ✅ 已完成:基础篇44篇 + 第45~72篇
- 📖 正在学:第72篇
- ⏳ 待学习:第73~108篇
👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇
👉 下一篇文章预告
🚀 下一篇:《第73篇:Spring IoC容器》
内容简介:Spring框架核心——IoC(控制反转)与DI(依赖注入)、
BeanFactoryvsApplicationContext、容器启动流程、@Configuration与@Bean原理。
👉 Spring全家桶专题正式开启,从IoC开始拿下Spring!
📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!
390


&spm=1001.2101.3001.11974&articleId=163615842&d=1&t=3&u=e09702f088cd43ea93ba37cd89ee8f19)

被折叠的 条评论
为什么被折叠?



