您的位置:首页 > Web前端 > JavaScript

JSP的get方式乱码问题

2018-01-14 10:42 267 查看
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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript servlet 乱码