get请求全局编码过滤器

 

 

 

MyEncodingFilter.java
复制代码
package com.gyf.web.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.catalina.connector.RequestFacade;

public class MyEncodingFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    @Override
    public void destroy() {}
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //1.设置POST请求中文乱码的问题
        request.setCharacterEncoding("UTF-8");
        System.out.println("拦截请求:" + request);
        
        //2.解决get请求的中文乱码问题
        //request : RequestFacade;
        HttpServletRequest hsr = (HttpServletRequest)request;
        if(hsr.getMethod().equalsIgnoreCase("get")){
            MyRequest myRequest = new MyRequest(hsr);
            //放行请求
            chain.doFilter(myRequest, response);
        }else{
            chain.doFilter(request, response);
        }
    
        
    }

}
/**
 * Wrapper包装类,装饰设计模式,内部有个真实对象的引用
 * @author gyf
 *
 */
class MyRequest extends HttpServletRequestWrapper{

    private HttpServletRequest request;
    private boolean isEncoding = false;//是否已经utf-8编码
    public MyRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
    
    @Override
    public String getParameter(String name) {
        return getParameterMap().get(name)[0];
    }
    
    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> map = request.getParameterMap();
        
        if(isEncoding == true){
            return map;
        }
        
        //遍历vlaue,改成utf-8编码
        for(Entry<String, String[]>  entry : map.entrySet()){
            //取数组值
            String[] values = entry.getValue();
            for(int i=0;i<values.length;i++){
                 try {
                     values[i] = new String(values[i].getBytes("ISO-8859-1"),"UTF-8");
                 } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        isEncoding = true;
        
        return map;
    }
}
复制代码

 

web.xml

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>day18-20180403</display-name>

    <!-- 配置编码的过滤器 -->
  <filter>
      <filter-name>myEncodingFilter</filter-name>
      <filter-class>com.gyf.web.filter.MyEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>myEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
复制代码

 

posted @   expworld  阅读(344)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示