首页 > 其他分享 >SpringMVC中接收前端传递的参数,设置了编码过滤器filter,但在控制台中还是出现乱码问题

SpringMVC中接收前端传递的参数,设置了编码过滤器filter,但在控制台中还是出现乱码问题

时间:2023-06-20 16:13:12浏览次数:36  
标签:filter return String get SpringMVC request 乱码 values parameterMap

SpringMVC中接收前端传递的参数,设置了编码过滤器filter,但在控制台中还是出现乱码问题。

 

在SpringMVC中遇到乱码问题不要慌,先配个SpringMVC的自带编码过滤器试试

 

<filter>
  <filter-name>CharacterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>forceResponseEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
这个没用,也不要慌,配个大佬写的看看

public class GenericEncodingFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("-----------------------------");

//处理response的字符编码
HttpServletResponse myResponse=(HttpServletResponse) response;
myResponse.setContentType("text/html;charset=UTF-8");

// 转型为与协议相关对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;

// 对request包装增强
HttpServletRequest myrequest = new MyRequest(httpServletRequest);
chain.doFilter(myrequest, response);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

}

//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {

private HttpServletRequest request;
//是否编码的标记
private boolean hasEncode;
//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
public MyRequest(HttpServletRequest request) {
super(request);// super必须写
this.request = request;
}

// 对需要增强方法 进行覆盖
@Override
public Map getParameterMap() {
// 先获得请求方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post请求
try {
// 处理post乱码
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {
// get请求
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) { // 确保get手动编码逻辑只运行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
// 处理get乱码
values[i] = new String(values[i]
.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}

//取一个值
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回参数的第一个值
}

//取所有值
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
Arrays.toString(values);
return values;
}
}



//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {

  private HttpServletRequest request;
/  /是否编码的标记
  private boolean hasEncode;
  //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
public MyRequest(HttpServletRequest request) {
super(request);// super必须写
this.request = request;
}

// 对需要增强方法 进行覆盖
@Override
public Map getParameterMap() {
// 先获得请求方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post请求
try {
// 处理post乱码
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {
// get请求
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) { // 确保get手动编码逻辑只运行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
// 处理get乱码
values[i] = new String(values[i]
.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}

//取一个值
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回参数的第一个值
}

//取所有值
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
Arrays.toString(values);
return values;
}
}
配置自定义Filter

<filter>
<filter-name>encoding</filter-name>
<filter-class>com.oyy.filter.GenericEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这个没用就是自己配置处理问题。(大怨种以踩坑)

 

在idea的tomcat部署中,查看自己的配置

vm选项中是否配置了-Dfile.encoding=UTF-8

 

 

JAVA_TOOL_OPTIONS也得是-Dfile.encoding=UTF-8

这种bug太恶心人了.........
————————————————
版权声明:本文为CSDN博主「一行代码七个报错」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_61084402/article/details/126159701

标签:filter,return,String,get,SpringMVC,request,乱码,values,parameterMap
From: https://www.cnblogs.com/ltf-1225598993/p/17493873.html

相关文章

  • 6. SpringMVC的视图
    SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户SpringMVC视图的种类很多,默认有转发视图和重定向视图当工程引入jstl的依赖,转发视图会自动转换为JstlView若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图......
  • 解决zabbix图形页面乱码
    安装字体yum-yinstallwqy-microhei-fonts修改字体\cp/usr/share/fonts/wqy-microhei/wqy-microhei.ttc/usr/share/fonts/dejavu/DejaVuSans.ttf注:\cp表示还原命令原意,直接cp=cp-i,\cp=只用cpTRANSLATEwithxEnglishArabicHebrewPolishBulg......
  • doris 报错: Insert has filtered data in strict mode, tracking url=
    最近使用doris插入数据时,报了如下错误: Inserthasfiltereddatainstrictmode,trackingurl=点击trackingurl的连接地址,可以查看报错具体详情我的程序报错时因为插入的数据长度超过字段长度,所以需要修改对应字段长度。通过命令进行修改即可ALTERTABLEmy_tableMODI......
  • python写入文件后中文乱码
    ......
  • SpringMVC WebUploader 分块上传
    ​ 4GB以上超大文件上传和断点续传服务器的实现随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往往在网上找一些简单的PHP或者Java程序来实现基......
  • 4. SpringMVC获取请求参数
    1.通过ServletAPI获取‍将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象‍​​‍2.通过控制器方法的形参获取请求参数‍在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到......
  • 正则表达式或filter_var判断网址URL是否合法
    <?phpfunctionis_url($url){$r="/http[s]?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is";if(preg_match($r,$url)){//returntrue;echo'正确的url地址';}else{//returnfalse;echo'不是合法的url地址';}}?><......
  • 全局过滤器------GlobalFilter
    前言SpringCloud的网关提供了31中过滤器,但这些过滤器作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑就需要用到全局过滤器。全局过滤器作用全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理......
  • SpringMVC
    1、什么是MVCMVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分M:Model,模型层,指工程中的JavaBean,作用是处理数据JavaBean分为两类:一类称为实体类Bean:专门存储业务数据的,如Student、User等一类称为业务处理Bean:指Service或Dao对象,专门用于处理业务逻辑和......
  • SpringMVC笔记
    一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式:warc>引入依赖3、配置web.xmla>默认配置方式b>扩展配置方式4、创建请求控制器5、创建springMVC的配置文件6、测试HelloWorlda>实现对首页的......