JSP的get方式乱码问题
JSP页面get方式传递参数,Javascript方法处理进行编码,Servlet后台处理解决中文及特殊符号乱码问题function f(){window.location.href="/ChineseServlet?username="+encodeURIComponent(encodeURIComponent('中文#@$^&*=-+_'));}public class Ch
JSP页面get方式传递参数,Javascript方法处理进行编码,Servlet后台处理解决中文及特殊符号乱码问题
function f(){
window.location.href="<%=request.getContextPath() %>/ChineseServlet
?username="+encodeURIComponent(encodeURIComponent('中文#@$^&*=-+_'));
}
public class ChineseServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String uname =request.getParameter("username");
String us = URLDecoder.decode(uname, "utf-8");
response.getWriter().println(us);
} catch (Exception e) {
e.printStackTrace();
}
}
}
地址栏中出现汉字的情况有两种,一种是汉字出现在URL的路径部分,一种是汉字出现在URL的传参的部分,第二种情况的时候必须采用编码后传参,接受时解码的方式完成传参。
总结:
1、汉字出现在URL路径部分的时候不需要编码解码;
2、使用encodeURI进行2次编码;
3、在openModelDialog()打开的模式窗体里没办法用request.getParameter正确获取参数;
客户端和服务器在传递数据时可以用过滤器filter解决字符编码问题,但filter只能解决post方式提交的数据。对于get方式,可以使用两次encodeURI(encodeURI(“中文”))并在服务器中使用URLDecoder.decode(“中文”, “UTF-8”);
今天用Ajax校验数据时也遇到这个问题,尽管页面、类和web容器都统一了字符编码,提交的数据依然是乱码,所以就采用了2次encodeURI()编码方式,乱码问题就解决了。
js
var name=document.myForm.username.value;
//此处也可以直接对整个url进行编码
var url="Ajax.do?method=check&name="+encodeURI(encodeURI(name));
xmlHttp.open("GET",url,true);
action
String name = request.getParameter("name");
name = URLDecoder.decode(name, "UTF-8");
//servlet返回数据时,将字符编码设置为utf-8就可以了,因为Ajax只支持utf-8
response.setContentType("text/xml;charset=utf-8");
PrintWriter out = response.getWriter();
out.print(result);
方案一:
1、使用encodeURI,两次编码:
javascript端加密中文:
<script>
function download(documentPath){
var url = "<c:url value='/product/download.action
?documentPath='/>"+documentPath;
url = encodeURI(encodeURI(url));
window.location.href=url;
}
</script>
servlet端取中文:
String documentPath = (String) request.getParameter('documentPath');
documentPath = URLDecoder.decode(documentPath,"utf-8");
2、使用encodeURIComponent 两次编码
javascript端加密中文:
<script>
content=encodeURIComponent(encodeURIComponent(content));
?method=doPublishBlog&content="+content;
</script>
servlet端取中文:
String content=(String)request.getParameter("content");
content=URLDecoder.decode(content,"UTF-8");
方案二:
使用servlet过滤器,在包中新建类ParameterEncodingFilter,添加代码:
public class ParameterEncodingFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request, response); // 访问下一个filter类,执行完所有的filter再去执行页面。
}
public void init(FilterConfig config) {
}
public void destroy() {
}
}
配置web.xml文件
<filter>
<filter-name>FormFilter</filter-name>
<filter-class>com.hwc.a.servlet.ParameterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FormFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
servlet端取中文:
String paramName= new String(request.getParameter("paramName")
.getBytes("ISO-8859-1"), "UTF-8");
更多推荐
所有评论(0)