用Filter为Servlet统一做中文编码处理

本文介绍如何利用Filter过滤器解决Servlet中中文参数乱码问题,避免在每个Servlet中重复进行解码和编码操作,提高代码整洁性。通过示例代码展示Filter的配置和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每当我们在Servlet中传递中文参数的时候总是会碰到乱码的问题,而通常的解决方式是在request请求进行解码处理,然后在response响应做编码处理:

request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

但是当业务复杂时,在Servlet中重复书写解码和编码的代码会十分繁琐,让代码看起来很臃肿。其实,可以通过Filter过滤器进行统一的解码编码处理

一个简易的显示本地时间的小例子

FirstServlet.java代码:

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FirstServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        Date date = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String dateString = formatter.format(date);
        String data=dateString;

        request.setAttribute("data", data);
        request.getRequestDispatcher("/show").forward(request, response);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doPost(request,response);
    }
}

ShowServlet.java代码:

import java.io.IOException;
import java.io.PrintWriter;

public class ShowServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        // 设置刷新自动加载的事件间隔为 3 秒
        response.setIntHeader("Refresh", 3);

        String text=(String)request.getAttribute("data");
        PrintWriter out=response.getWriter();

        out.write("本地时间(The time is):"+text+"(3秒后自动刷新)");
}

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doPost(request,response);
    }
}

DemoFilter.java代码:

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

public class DemoFilter implements javax.servlet.Filter {
    public void destroy() {
    }

    public void doFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //获取URL的路径和参数
        HttpServletRequest req = (HttpServletRequest) request;
        String path=req.getServletPath();
        String param=req.getQueryString();
        if(path!=null&&param!=null){
            path=path+"?"+param;//全请求路径
        }
        System.out.println("Path:"+path);
        //跳转或带参数跳转
        request.getRequestDispatcher(path).forward(request, response);
    }

    public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {

    }

}

web.xml配置文件:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <filter>
        <filter-name>DemoFilter</filter-name>
        <filter-class>com.sunsharing.DemoFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>DemoFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>com.sunsharing.FirstServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ShowServlet</servlet-name>
        <servlet-class>com.sunsharing.ShowServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/show</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

完毕后启动tomcat,在浏览器的url地址输入:localhost:8080/first

预览效果:
预览效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值