解决表单提交参数乱码问题【终极版】不看后悔

解决表单提交参数乱码问题【终极版】不看后悔

提交表单乱码问题,一直是困然网站开发人员的“吐血”问题,这问题虽说不痛不痒,但是绝对“恶心人”。之前自己遇到这个问题是,一直是能绕过就绕过,懒得理它,直到今天我又遇到它,我知道,我必须得治治它了。

URL传参

表单标签传参

混合传参

GET

A

B

C

POST

D

E

F

乱码之所以乱码,是因为编码和解码的格式不一致。

ISO-8859-1,才发现

不过既然要死磕,就一定要把这问题解决。

传递呢?

传递的参数的字符串,当然了,参数也就包含在其中。所以我们只要把其中的参数名分离出来即可,这些就是我们需要进行转码的,,别的不需要解码。

思路已经清楚了,下面直接贴本人的成型代码。

/* * Copyright (c) 2014, ShiXiaoyong. All rights reserved. */package com.common.filter;import java.io.UnsupportedEncodingException;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;/** * 描述:GetHttpServletRequestWrapper * * <pre> * HISTORY * **************************************************************** * ID DATEPERSONREASON * 1 2015-3-6ShixyCreate * 2 2015-3-23Shixy增加对post混合传参方式的支持 * **************************************************************** * </pre> * * @author Shixy * @since 1.0 */public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {private String charset = "UTF-8";private static final String ENCODED = "__encoded";private Map<String, String> urlParamNames = null;/** * @param request */public GetHttpServletRequestWrapper(HttpServletRequest request) {super(request);initUrlParameterNames();}/** * 获得被装饰对象的引用和采用的字符编码 * * @param request * @param charset */public GetHttpServletRequestWrapper(HttpServletRequest request, String charset) {super(request);this.charset = charset;initUrlParameterNames();}@Overridepublic Enumeration<String> getParameterNames() {return super.getParameterNames();}/** * 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换 */@Overridepublic String getParameter(String name) {String value = super.getParameter(name);// 根据urlParamNames是否包含此值来判断是否需要对其进行get方式转码if (!urlParamNames.containsKey(name)) {return value;}if (null != value) {value = convert(value);}return value;}@Overridepublic String[] getParameterValues(String name) {// values也是传值String[] values = super.getParameterValues(name);if ((!urlParamNames.containsKey(name))) {return values;}for (int i = 0; i < values.length; i++) {values[i] = convert(values[i]);}return values;}@Overridepublic Map<String, String[]> getParameterMap() {Map<String, String[]> map = super.getParameterMap();// 是否已经转码的标识位// 因为map是传引用的,因此多次调用时,原值会被转码转码在转码,因此要设置此标志位,防止多次转码if ("1".equals(this.getAttribute(ENCODED))) {return map;}// 对map中所有的url传参进行编码// 遍历map中的参数,转换器编码for (String key : urlParamNames.keySet()) {String[] value = map.get(key);if (value != null) {for (int i = 0; i < value.length; i++) {value[i] = convert(value[i]);}}}this.setAttribute(ENCODED, "1");return map;}/** * 将字符串转码 * ISO-8859-1为国际通用url编码 * @param target * @return */private String convert(String target) {try {return new String(target.trim().getBytes("ISO-8859-1"), charset);} catch (UnsupportedEncodingException e) {return target;}}/** * 初始化设置url传值的参数名 */private void initUrlParameterNames() {if (null != urlParamNames) {return;}// 获取所有的url传参的参数名urlParamNames = new HashMap<String, String>();String st = this.getQueryString();if (null == st || 0 == st.length()) {return;}String[] params = this.getQueryString().split("&");for (String p : params) {if (!p.contains("=")) {continue;}urlParamNames.put(p.substring(0, p.indexOf("=")), null);}}}

转码我们的参数:

同时也用对她的怀念来惩罚自己。

解决表单提交参数乱码问题【终极版】不看后悔

相关文章:

你感兴趣的文章:

标签云: