利用过滤器(Filter)统一处理请与响应乱码


前言

在web项目中,由于不同的浏览器和服务器对请求和响应处理的编码格式不一样,不统一编码格式会出现乱码现象,而许多编码格式对中文的处理不太好,所以在服务器接收请求和返回给浏览器响应的时候我们需要对请求和响应的编码格式进行统一的处理,设置为UTF-8。


一、直接在servlet中设置处理乱码

我们常见的使用方法就是在在servlet中直接加入以下代码

//设置请求和响应统一编码格式为UTF-8
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");

而当你服务器的servlet数量多起来了,你就需要在每一个servlet中加入上面两段代码,就会有代码冗余,这个时候我们就可以使用过滤器将这些共性的代码抽取出来。

二、在过滤器中设置处理乱码

1.什么是过滤器

引入一张图
在这里插入图片描述可以看到,过滤器是介于浏览器和web资源(servlet/jsp/html等)之间的,它的作用其实就是将你对指定资源的请求“过滤”一下,然后送到web资源,或者将你指定资源的响应“过滤”一下,然后送到浏览器,它不单单只有处理乱码的作用,也有很多其他用处,比如过滤敏感字和登陆验证过滤等。
实现过滤器需要写一个java类来实现Filter接口,
有了过滤器,我们就可以直接在过滤器中设置请求和响应的编码格式。

2.利用@WebFilter注解配置过滤器

使用前首先先介绍@WebFilter注解的常用的三种拦截形式:
(1)精确拦截匹配:比如/index.jsp,/myservlet1

//只会拦截向index.jsp发送的请求和返回的响应
@WebFilter(value="/index.jsp")

(2)后缀拦截匹配:比如*.jsp ,*.html

//会拦截所有发送向以.jsp为后缀的请求和返回的响应
@WebFilter(value="*.jsp")

(3)通配符拦截匹配:/* ,/abc/*

//会拦截所有发送向abc资源目录下的所有资源的请求和返回的响应
@WebFilter(value="/abc/*")

具体示例代码

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

@WebFilter(value="/*")//拦截所有请求和响应
public class servletFilter implements Filter {


    @Override
   //初始化方法
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //统一处理请求和响应的乱码
        servletRequest.setCharacterEncoding("UTF-8");
        servletResponse.setCharacterEncoding("UTF-8");
//  或者 servletResponse.setContentType("text/html;charset=utf-8");

        //过滤完之后需要放行请求和响应
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    //销毁方法
    public void destroy() {

    }
}

这样,一个利用注解实现的简单过滤器就完成了。(本文只演示利用注解配置过滤器,利用xml配置文件配置过滤器的方法可自行学习)


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你提供一个简单的Java过滤器示例,用于解决响应乱码求端乱码的问题。 首先,我们需要在web.xml文件中配置过滤器: ```xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>com.example.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 然后,我们需要编写一个名为EncodingFilterJava过滤器类,实现doFilter方法,如下所示: ```java package com.example; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebFilter(filterName = "encodingFilter", urlPatterns = "/*") public class EncodingFilter implements Filter { private String encoding; public void init(FilterConfig filterConfig) throws ServletException { this.encoding = filterConfig.getInitParameter("encoding"); if (this.encoding == null) { this.encoding = "UTF-8"; } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; // 设置字符集 req.setCharacterEncoding(encoding); // 设置响应字符集 resp.setCharacterEncoding(encoding); resp.setContentType("text/html; charset=" + encoding); // 继续处理求 chain.doFilter(request, response); } public void destroy() { encoding = null; } } ``` 在上面的代码中,我们首先获取了配置的字符编码,然后在doFilter方法中设置了字符集和响应字符集,并继续处理求。 这样,我们就实现了一个简单的过滤器,用于解决响应乱码以及求端乱码的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值