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");
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐