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的执行顺序由
浙公网安备 33010602011771号