您的位置:首页 > 其它

URL中文传值出现乱码处理方法

2013-07-01 21:34 190 查看
例如:http://loaclhost:8086/MyProject/servlet?work=部门主管审批,进行连接时会出现部门主管审批的乱码。

为了处理中文乱码部分能够在整个 WEB 系统中都能够使用到,所以将中文乱码处理写成了一个 Filter( 过滤器 ) ,并在web.xml 中配置所有的请求都将经过这个 Filter 进行过滤。
过滤器处理过程:
1. 获得参数名集合 request.getParameterNames();
2.根据参数名获得参数值 request.getParameterValues("参数名");
3.获得字符串的 UTF-8 编码格式字符outStr = new String(inStr.getBytes( "iso-8859-1" ), "UTF-8" );
4.将参数名对应结果藏入请求中request.setAttribute("name",);
5.继续执行下一个 filter, 无一下个 filter 则执行请求chain.doFilter(request, response);

6.通过过滤器之后,就可以进入请求中对应 leavesp 的 servlet 了,此时在 servlet 中通过 String work=request.getParameter(“work”); 就可以获得 url 中传递过来的中文参数值了,结果为 work=” 部门主管审批 ” 。

Filter 部分的代码如下:
文件名: ProFilter.java
package com.util.filters;

import java.io.IOException;
import java .io.UnsupportedEncodingException;
import java.util.Enumeration;

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.HttpServletResponse;

public class ProFilter implements Filter
{

protected FilterConfig filterConfig ;
/**
* 初始化
*/
public void init(FilterConfig filterConfig) throws ServletException
{
this . filterConfig =filterConfig;
}

/**
* 将 inStr 转为 UTF - 8 的编码形式
* @param inStr 输入字符串
* @return UTF - 8 的编码形式的字符串
* @throws UnsupportedEncodingException
*/
private String toUTF(String inStr) throws UnsupportedEncodingException
{
String outStr = "" ;
if (inStr != null )
{
//outStr=java.net.URLDecoder.decode(inStr);// 不用 decode 了 , 到这的时候就已经自动 decode 过了
// 将字符串转为 UTF-8 编码形式
outStr = new String(inStr.getBytes( "iso-8859-1" ), "UTF-8" );
}
return outStr;
}

/**
* 中文乱码过滤处理
*/
public void doFilter(ServletRequest svlrequest, ServletResponse
svlresponse,
FilterChain chain) throws IOException, ServletException
{
// 将 Servlet 请求与响应对象转换成 HttpServlet 请求与响应对象
HttpServletRequest request=(HttpServletRequest)svlrequest;
HttpServletResponse response=(HttpServletResponse)svlresponse;

// 获得请求的方式 (1.post or 2.get), 根据不同请求方式进行不同处理
String method = request.getMethod();
//1. 以 post 方式提交的请求 , 直接设置编码为 UTF-8
if (method.equalsIgnoreCase( "post" ))
{
try
{
request.setCharacterEncoding( "UTF-8" );
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
//2. 以 get 方式提交的请求
else
{
// 取出客户提交的参数集
Enumeration<String> paramNames = request.getParameterNames();
// 遍历参数集取出每个参数的名称及值
while (paramNames.hasMoreElements())
{
String name = paramNames.nextElement(); // 取出参数名称
String values[] = request.getParameterValues(name); // 根据参数名称取出其值
// 如果参数值集不为空
if (values != null )
{
// 如果参数值集中只有一个值
if (values. length ==
1)
{
try
{
// 调用 toUTF(values[0]) 函数 ,(values[0] 即第一个参数值 ) 方法转换参数值的字元编码
String vlustr=toUTF(values[0]);
// 并将该值以属性的形式藏在 request
request.setAttribute(name, vlustr);
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
// 如果参数值集中有多个值
else
{
// 遍历参数值集
for ( int i=0;i<values. length ;i++)
{
try
{
// 回圈依次将每个值调用 toUTF(values[i]) 方法转换参数值的字元编码
String vlustr=toUTF(values[i]);
values[i] = vlustr;
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
// 将该值以属性的形式藏在 request
request.setAttribute(name, values);
}
}
}

}
// 设置响应方式和支持中文的字元集
response.setContentType( "text/html;charset=UTF-8" );

// 继续执行下一个 filter, 无一下个 filter 则执行请求
chain.doFilter(request, response);
}

/**
* 销毁方法
*/
public void destroy()
{

}
}

过滤器部分,可用来处理页面提交的 post 和 get 方法产生的中文乱码问题。
Post 方式提交的数据( form 表单中提交的数据)只需要进行请求字符编码设置 request.setCharacterEncoding("UTF-8" ); 和响应设置 response.setContentType( "text/html;charset=UTF-8" ); 设置就可以了。
Get 方式提交的数据会包含在 url 中,(如: leavesp?work= 部门主管审批),则需要取出参数名:Enumeration<String> paramNames = request.getParameterNames(); (如: work )和取出参数值:String
values[] = request.getParameterValues(name);( 如:部门主管审批 ), 然后再将参数值进行编码转换: outStr = new String(inStr.getBytes( "iso-8859-1" ), "UTF-8" );

过滤器写好这后就需要到 web.xml 中 < web-app > 与 </ web-app > 之间进行配置了, web.xml 中配置如下:
<!-- 配置过滤器 -->
< filter >
< description > 处理中文乱码过滤器 </ description >
< filter-name > ProFilter </ filter-name >
< filter-class > com.util.filters.ProFilter </ filter-class >
</ filter >
< filter-mapping >
< filter-name > ProFilter </ filter-name >
< url-pattern > * </ url-pattern ><!-- 过滤所有请求,注: tomcat5 请用 /*
-->
</ filter-mapping >

这样配置之后只要页面有任何请求都会通过 ProFilter 进行中文处理了,就不会再发生中文乱码问题了。

那一串通过 get 传递过来的中文处理过程如下:
1. 在 jsp 页面的 JavaScript 里面进行编码处理:
url=encodeURI(‘ leavesp?work= 部门主管审批 ’)
编码后结果: url= leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9
2. 因为在 web.xml 过滤器配置为 < url-pattern > * </ url-pattern > 所以所有请求将会通过过滤器进行处理,此过滤器处理过程如下:
2.1 获得参数名集合:
Enumeration<String> paramNames = request.getParameterNames();
String name = paramNames.nextElement();结果中有 name=’work’ ;一值。

2.2 通过参数名获得参数值:
String values[] = request.getParameterValues(name);
因 work 的值只有一个所以 2.2 的结果为: values[0]=’ é ƒ¨é—¨ä¸»ç®¡å®¡æ‰¹’;( 此处得到的是字符串:“部门主管审批”的 iso-8859-1 编码格式字符 )

2.3 获得字符串的 UTF-8 编码格式字符:
outStr = new String(inStr.getBytes( "iso-8859-1" ), "UTF-8" );获得的结果为 outStr= “部门主管审批” .
至此中文已经正常了。

不过过滤器还没处理结束,还得将参数名对应的值 ( 已经处理的值 ) 再重新藏到请求中去。
2.4 将参数名对应结果藏入请求中:
request.setAttribute(name, outStr );
通过 2.4 处理后,请求中的 work 的值就变成了:部门主管审批

2.5 继续执行下一个 filter, 无一下个 filter 则执行请求
chain.doFilter(request, response);
3.通过过滤器之后,就可以进入请求中对应 leavesp 的 servlet 了,此时在 servlet 中通过 String work=request.getParameter(“work”); 就可以获得 url 中传递过来的中文参数值了,结果为 work=” 部门主管审批 ” 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: