Filter与Listener实现权限校验
用Filter统一处理字符编码(解决中文乱码问题)
学习目标与前置知识
- 理解Filter的基本概念和生命周期。
- 掌握如何在Filter中设置字符编码。
- 了解常见的字符编码问题及其解决方案。
核心原理图解
- Filter链的执行流程图。
- 字符编码设置的时序图。
分步骤代码实现
-
创建Filter类
首先,我们需要创建一个Filter类来处理字符编码。这个类需要实现
javax.servlet.Filter
接口,并重写doFilter
方法。import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class CharacterEncodingFilter implements Filter { private String encoding = "UTF-8"; @Override public void init(FilterConfig filterConfig) throws ServletException { // 可以从配置文件中读取编码方式 encoding = filterConfig.getInitParameter("encoding"); if (encoding == null) { encoding = "UTF-8"; } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 设置请求和响应的字符编码 request.setCharacterEncoding(encoding); response.setCharacterEncoding(encoding); // 继续Filter链的执行 chain.doFilter(request, response); } @Override public void destroy() { // 销毁Filter时的清理工作 } }
-
配置Filter
在
web.xml
中配置Filter,或者使用注解@WebFilter
来自动注册Filter。<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>com.example.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
测试字符编码
创建一个简单的JSP页面来测试字符编码是否设置成功。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>字符编码测试</title> </head> <body> <form method="post" action="process.jsp"> <input type="text" name="username" placeholder="请输入用户名"> <input type="submit" value="提交"> </form> </body> </html>
处理表单提交的
process.jsp
页面:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>处理结果</title> </head> <body> <h1>欢迎你,<%= request.getParameter("username") %>!</h1> </body> </html>
常见问题排查
-
问题:提交中文字符后显示乱码
- 原因:可能是Filter没有正确设置字符编码,或者Filter的URL模式没有覆盖到所有请求。
- 解决方案:检查Filter的配置,确保所有请求都经过Filter处理。同时,确保JSP页面的字符编码设置为UTF-8。
-
问题:Filter链没有继续执行
- 原因:在
doFilter
方法中没有调用chain.doFilter(request, response)
。 - 解决方案:确保在设置字符编码后调用
chain.doFilter(request, response)
,以继续Filter链的执行。
- 原因:在
扩展思考与参考资料
- 思考:Filter的执行顺序由什么决定?
- Filter的执行顺序由
web.xml
中<filter-mapping>
的顺序决定。如果使用注解@WebFilter
,则由Servlet容器决定执行顺序
- Filter的执行顺序由
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理