• 【Java】全站编码过滤器GenericEncodingFilter代码与配置


    编码过滤器GenericEncodingFilter:

     
      1 package com.fuck.web.filter;
      2 
      3 import java.io.IOException;
      4 import java.io.UnsupportedEncodingException;
      5 import java.util.Map;
      6 
      7 import javax.servlet.Filter;
      8 import javax.servlet.FilterChain;
      9 import javax.servlet.FilterConfig;
     10 import javax.servlet.ServletException;
     11 import javax.servlet.ServletRequest;
     12 import javax.servlet.ServletResponse;
     13 import javax.servlet.http.HttpServletRequest;
     14 import javax.servlet.http.HttpServletRequestWrapper;
     15 
     16 /**
     17  * 解决get和post请求 全部乱码
     18  * 
     19  * @author seawind
     20  * 
     21  */
     22 public class GenericEncodingFilter implements Filter {
     23 
     24     @Override
     25     public void destroy() {
     26     }
     27 
     28     @Override
     29     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
     30         // 转型为与协议相关对象
     31         HttpServletRequest httpServletRequest = (HttpServletRequest) request;
     32         // 对request包装增强
     33         HttpServletRequest myrequest = new MyRequest(httpServletRequest);
     34         response.setContentType("text/html;charset=utf-8");
     35         chain.doFilter(myrequest, response);
     36     }
     37 
     38     @Override
     39     public void init(FilterConfig filterConfig) throws ServletException {
     40     }
     41 
     42 }
     43 
     44 // 自定义request对象
     45 class MyRequest extends HttpServletRequestWrapper {
     46 
     47     private HttpServletRequest request;
     48 
     49     private boolean hasEncode;
     50 
     51     public MyRequest(HttpServletRequest request) {
     52         super(request);// super必须写
     53         this.request = request;
     54     }
     55 
     56     // 对需要增强方法 进行覆盖
     57     @Override
     58     public Map getParameterMap() {
     59         // 先获得请求方式
     60         String method = request.getMethod();
     61         if (method.equalsIgnoreCase("post")) {
     62             // post请求
     63             try {
     64                 // 处理post乱码
     65                 request.setCharacterEncoding("utf-8");
     66                 return request.getParameterMap();
     67             } catch (UnsupportedEncodingException e) {
     68                 e.printStackTrace();
     69             }
     70         } else if (method.equalsIgnoreCase("get")) {
     71             // get请求
     72             Map<String, String[]> parameterMap = request.getParameterMap();
     73             if (!hasEncode) { // 确保get手动编码逻辑只运行一次
     74                 for (String parameterName : parameterMap.keySet()) {
     75                     String[] values = parameterMap.get(parameterName);
     76                     if (values != null) {
     77                         for (int i = 0; i < values.length; i++) {
     78                             try {
     79                                 // 处理get乱码
     80                                 values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");
     81                             } catch (UnsupportedEncodingException e) {
     82                                 e.printStackTrace();
     83                             }
     84                         }
     85                     }
     86                 }
     87                 hasEncode = true;
     88             }
     89             return parameterMap;
     90         }
     91 
     92         return super.getParameterMap();
     93     }
     94 
     95     @Override
     96     public String getParameter(String name) {
     97         Map<String, String[]> parameterMap = getParameterMap();
     98         String[] values = parameterMap.get(name);
     99         if (values == null) {
    100             return null;
    101         }
    102         return values[0]; // 取回参数的第一个值
    103     }
    104 
    105     @Override
    106     public String[] getParameterValues(String name) {
    107         Map<String, String[]> parameterMap = getParameterMap();
    108         String[] values = parameterMap.get(name);
    109         return values;
    110     }
    111 
    112 }

    WEB-INF下的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>estoredemo</display-name>
      <filter>
         <filter-name>GenericEncodingFilter</filter-name>
         <filter-class>com.fuck.web.filter.GenericEncodingFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>GenericEncodingFilter</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>

    =================================================================================================

    网上看到另一个,其实和上面基本一模一样,不过也贴上做个备份吧

     1 import java.io.IOException;  
     2 import java.util.Map;  
     3   
     4 import javax.servlet.Filter;  
     5 import javax.servlet.FilterChain;  
     6 import javax.servlet.FilterConfig;  
     7 import javax.servlet.ServletException;  
     8 import javax.servlet.ServletRequest;  
     9 import javax.servlet.ServletResponse;  
    10 import javax.servlet.http.HttpServletRequest;  
    11 import javax.servlet.http.HttpServletRequestWrapper;  
    12   
    13 public class EncodingFilter implements Filter {  
    14     private FilterConfig config = null;  
    15     private String encode = null;  
    16      
    17      public void destroy() {  
    18          
    19     }  
    20   
    21     public void doFilter(ServletRequest request, ServletResponse response,  
    22             FilterChain chain) throws IOException, ServletException {  
    23         response.setContentType("text/html;charset="+encode); //--解决响应乱码  
    24         //--包装改造request中和获取请求参数相关的方法解决请求参数乱码  
    25         chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);  
    26     }  
    27      
    28     public void init(FilterConfig filterConfig) throws ServletException {  
    29         this.config = filterConfig;  
    30         encode = config.getInitParameter("encode") == null?"utf-8":config.getInitParameter("encode");  
    31     }  
    32   
    33   
    34   
    35     //内部类,装饰类改造HttpServletRequest   的三个方法  
    36     class MyHttpServletRequest extends HttpServletRequestWrapper{  
    37         private HttpServletRequest request = null;  
    38         private boolean isNotEncode = true;  
    39         public MyHttpServletRequest(HttpServletRequest request) {  
    40             super(request);  
    41             this.request = request;  
    42         }  
    43          
    44         @Override  
    45         public Map getParameterMap() {  
    46             try{  
    47                 if(request.getMethod().equalsIgnoreCase("POST")){//--如果是post提交,一行代码解决post提交请求参数乱码  
    48                     request.setCharacterEncoding(encode);  
    49                     return request.getParameterMap();  
    50                 }else if(request.getMethod().equalsIgnoreCase("GET")){//--如果是get提交,则应该手动编解码解决乱码  
    51                     Map<String,String[]> map = request.getParameterMap();//获取有乱码的map  
    52                     if(isNotEncode){//只能在第一次解决乱码  
    53                         for(Map.Entry<String, String[]> entry : map.entrySet()){//遍历map,解决所有值的乱码  
    54                             String [] vs = entry.getValue();  
    55                             for(int i=0;i<vs.length;i++){  
    56                                 vs[i] = new String(vs[i].getBytes("iso8859-1"),encode);  
    57                             }  
    58                         }  
    59                         isNotEncode = false;//设置为false,第二次就不会再进这个代码块了  
    60                     }  
    61                     return map;  
    62                 }else{  
    63                     return request.getParameterMap();  
    64                 }  
    65             }catch (Exception e) {  
    66                 e.printStackTrace();  
    67                 throw new RuntimeException(e);  
    68             }  
    69         }  
    70          
    71         @Override  
    72         public String[] getParameterValues(String name) {  
    73             return (String[]) getParameterMap().get(name);  
    74         }  
    75          
    76         @Override  
    77         public String getParameter(String name) {  
    78             return getParameterValues(name) == null ? null : getParameterValues(name)[0];  
    79         }  
    80     }  
    81 }  
    <filter>  
        <description>全站乱码过滤器</description>  
        <filter-name>encodeFilter</filter-name>  
        <filter-class>com.java.filter.EncodingFilter</filter-class>  
        <init-param>  
            <param-name>encode</param-name>  
            <param-value>utf-8</param-value>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>encodeFilter</filter-name>  
        <url-pattern>/*</url-pattern> -----------------------------------------拦截的路径  
    </filter-mapping>  
  • 相关阅读:
    100 道 Linux 常见面试题
    借助Redis锁,完美解决高并发秒杀问题
    'cnpm'安装install
    Git常用命令及方法大全
    idea controller service impl mapper xml切换跳转快捷键
    idea创建springboot项目用阿里云镜像
    mybatis.type-aliases-package的作用和用法
    MyBatis Generator
    https://antdv.com/components/layout-cn/
    https://mvnrepository.com/search?q=mysql-connector-java //maven
  • 原文地址:https://www.cnblogs.com/dflmg/p/6278434.html
Copyright © 2020-2023  润新知