Servlet response.sendRedirect编码问题

Hof*_*ann 3 java jsp servlets utf-8 character-encoding

所以我以一种天真的方式使用GET重定向我的用户:

response.sendRedirect("/path/index.jsp?type="+ e.getType() 
   +"&message="+ e.getMessage());
Run Code Online (Sandbox Code Playgroud)

这个工作正常,直到我不得不发送消息,作为向用户显示的实际文本.问题是如果消息中包含非ASCII字符.我的.jsp文件以UTF-8编码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)

因此'message'中的所有非ASCII字符都会出现乱码.我不想将我的JVM默认编码设置为UTF-8,那么我该如何解决这个问题呢?我试着用

response.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

在重定向之前的Servlet上,但它不起作用.当我尝试执行时:

out.print(request.getCharacterEncoding());
Run Code Online (Sandbox Code Playgroud)

在我的.jsp文件中,它打印'null'.

Bal*_*usC 8

sendRedirect()方法不会为您编码查询字符串.你自己去做.

response.sendRedirect("/path/index.jsp?type=" + URLEncoder.encode(e.getType(), "UTF-8")
    + "&message=" + URLEncoder.encode(e.getMessage(), "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

您可能希望将样板重构为实用方法,需要大约一个Map.

请注意,我假设服务器配置为使用UTF-8解码GET请求URI.你没有告诉你正在使用哪一个,但是在例如Tomcat的情况下,它是URIEncoding="UTF-8"<Context>元素添加属性的问题.

也可以看看:


具体问题无关,这language="java"是默认值,只是省略它.该 contentType="text/html; charset=UTF-8"也是默认已经使用JSP与时pageEncoding="UTF-8",就忽略它.你真正需要的只是<%@ page pageEncoding="UTF-8"%>.请注意,这确实有效response.setCharacterEncoding("UTF-8"),因此这解释了为什么它没有效果.在request.getCharacterEncoding()只关注POST请求的身体,而不是GET请求URI,所以它在GET请求的情况无关.