Filter与Listener实现权限校验

用Filter统一处理字符编码(解决中文乱码问题)

学习目标与前置知识

  • 理解Filter的基本概念和生命周期。
  • 掌握如何在Filter中设置字符编码。
  • 了解常见的字符编码问题及其解决方案。

核心原理图解

  • Filter链的执行流程图。
  • 字符编码设置的时序图。

分步骤代码实现

  1. 创建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时的清理工作 
        }
    }
    
  2. 配置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>
    
  3. 测试字符编码

    创建一个简单的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容器决定执行顺序
posted @   f-52Hertz  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示