Servlet 实用技巧与常见问题
2025/9/17大约 3 分钟
Servlet 实用技巧与常见问题
前置知识
建议你已掌握 Servlet 基础、生命周期、过滤器与监听器等内容。
目录
开发调试实用技巧
- 日志调试:推荐使用 Lombok 的
@Slf4j
,方便输出调试信息 - 断点调试:IDEA/Eclipse 支持断点调试 Servlet,需配置远程调试端口
- 热部署:利用 Tomcat 插件或 Spring Boot DevTools 提升开发效率
- 参数与路径检查:善用
req.getParameter
、req.getRequestURI
等方法 - 异常捕获:统一异常处理,避免 500 错误页面
日志调试示例
@Slf4j
@WebServlet("/debug")
public class DebugServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
log.info("收到请求: {}", req.getRequestURI());
resp.getWriter().write("调试信息已记录");
}
}
Servlet 安全建议
- 输入校验:防止 XSS、SQL 注入等攻击
- Session 管理:及时失效、避免固定 SessionId
- 敏感信息保护:密码、Token 不应明文传输
- 限制请求方法:只允许必要的 HTTP 方法
- 目录与资源隔离:敏感资源放在
WEB-INF
下,防止直接访问
输入校验示例
String username = req.getParameter("username");
if (username != null && username.matches("^[a-zA-Z0-9_]{3,16}$")) {
// 合法用户名
} else {
resp.sendError(400, "用户名格式不正确");
}
性能优化建议
- 连接池:数据库操作建议使用连接池(如 Druid、HikariCP)
- 资源复用:避免在每次请求中重复创建对象
- 静态资源分离:图片、JS、CSS 建议由 Nginx 等服务器托管
- GZIP 压缩:开启响应压缩,减少带宽消耗
- 合理设置缓存:静态内容可设置 Cache-Control
GZIP 压缩配置(web.xml)
<filter>
<filter-name>GzipFilter</filter-name>
<filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
常见报错与解决方案
常见报错
场景 | 报错信息 | 解决方案 |
---|---|---|
依赖冲突 | java.lang.ClassNotFoundException: javax.servlet.* | 检查 servlet-api 依赖 scope 是否为 provided |
404 错误 | 资源未找到 | 检查 urlPatterns、部署路径、大小写 |
500 错误 | NullPointerException | 检查参数、对象初始化、日志 |
中文乱码 | 乱码或问号 | 设置 req/resp 编码为 UTF-8 |
Session 丢失 | 登录态失效 | 检查 Cookie、Session 配置 |
FAQ:常见问题解答
1. Servlet 如何实现文件上传?
- 需使用第三方库(如 Apache Commons FileUpload)或 Servlet 3.0+ 的
@MultipartConfig
- 参考官方文档或 SpringMVC 的文件上传实现
2. 如何优雅处理全局异常?
- 可自定义
error-page
,或在 Filter/Listener 中统一捕获异常 - SpringMVC 推荐使用
@ControllerAdvice
3. Servlet 如何与前端分离开发?
- 前后端通过 JSON 交互,Servlet 输出
application/json
- 推荐使用 RESTful 风格接口
4. 如何防止表单重复提交?
- 可用 Token 机制、前端按钮禁用、服务端校验
学习资源与小结
- 推荐多用日志、断点、热部署提升开发效率
- 安全、性能、编码规范同等重要
- 遇到问题优先查日志、官方文档、社区问答
- Servlet 是 Java Web 的基石,后续可深入学习 Spring、微服务等
本文为 Servlet 系列教程收官篇,感谢阅读,祝你学有所成!