- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们可以通过 ServletContext#setRequestCharacterEncoding
设置用于读取请求正文的默认字符编码(从 Servlet 4.0 开始)。
我认为HttpServletRequest#getReader
的字符编码可以使用 ServletContext#setRequestCharacterEncoding(*)
设置.
但是读者认为HttpServletRequest#getReader
返回似乎不使用 ServletContext#setRequestCharacterEncoding
设置的编码来解码字符.
我的问题是:
ServletContext#setRequestCharacterEncoding
对 HttpServletRequest#getReader
没有影响(但它对 HttpServletRequest#getParameter
有影响)?ServletContext#setRequestCharacterEncoding
和HttpServletRequest#getReader
行为? (我阅读了 Servlet 规范版本 4.0,但找不到任何有关此类行为的规范。)
我创建了一个简单的 war 应用程序并进行了测试 ServletContext#setRequestCharacterEncoding
.
[环境]
[index.html]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="/SimpleWarApp/app/simple" method="post">
<!-- The value is Japanese character '\u3042' -->
<input type="text" name="hello" value="あ"/>
<input type="submit" value="submit!"/>
</form>
<button type="button" id="the_button">post</button>
<script>
document.getElementById('the_button').addEventListener('click', function() {
var xhttp = new XMLHttpRequest();
xhttp.open('POST', '/SimpleWarApp/app/simple');
xhttp.setRequestHeader('Content-Type', 'text/plain');
<!-- The body content is Japanese character '\u3042' -->
xhttp.send('あ');
});
</script>
</body>
</html>
[InitServletContextListener.java]
@WebListener
public class InitServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().setRequestCharacterEncoding("UTF-8");
}
}
[SimpleServlet.java]
@WebServlet("/app/simple")
@SuppressWarnings("serial")
public class SimpleServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// req.setCharacterEncoding("UTF-8");
System.out.println("requestCharacterEncoding : " + req.getServletContext().getRequestCharacterEncoding());
System.out.println("req.getCharacterEncoding() : " + req.getCharacterEncoding());
String hello = req.getParameter("hello");
if (hello != null) {
System.out.println("hello : " + req.getParameter("hello"));
} else {
System.out.println("body : " + req.getReader().readLine());
}
}
}
我没有任何 servlet 过滤器。以上三个就是这个war应用的全部组件。(GitHub)
案例1:当我提交带有参数“hello”的表单时,“hello”的值已成功解码,如下所示。
requestCharacterEncoding : UTF-8
req.getCharacterEncoding() : UTF-8
hello : あ
案例2:当我点击“发布”并发送文本内容时,请求正文无法成功解码,如下所示。(虽然我确认请求正文是由UTF-8编码的,如下所示: E3 81 82
)
requestCharacterEncoding : UTF-8
req.getCharacterEncoding() : UTF-8
body : ???
案例3:当我还使用 HttpServletRequest#setCharacterEncoding
设置编码时相反,在 servlet 的“doPost”方法的第一行,请求正文已成功解码。
requestCharacterEncoding : UTF-8
req.getCharacterEncoding() : UTF-8
body : あ
案例4:当我使用http.setRequestHeader('Content-Type', 'text/plain; charset=UTF-8');
时javascript,请求正文已成功解码。
requestCharacterEncoding : UTF-8
req.getCharacterEncoding() : UTF-8
body : あ
案例5:当我不打电话时req.getParameter("hello")
,请求体无法成功解码。
requestCharacterEncoding : UTF-8
req.getCharacterEncoding() : UTF-8
body : ???
案例6:当我不打电话时ServletContext#setRequestCharacterEncoding
在InitServletContextListener.java
,未设置字符编码。
requestCharacterEncoding : null
req.getCharacterEncoding() : null
body : ???
[注意]
(*)我这么认为是因为:
HttpServletRequest#getReader
的java文档说
"The reader translates the character data according to the character encoding used on the body".
HttpServletRequest#getCharacterEncoding
的java文档说
"Returns the name of the character encoding used in the body of this request".
HttpServletRequest#getCharacterEncoding
的java文档还说
"The following methods for specifying the request character encoding are consulted, in decreasing order of priority: per request, per web app (using ServletContext.setRequestCharacterEncoding, deployment descriptor)".
ServletContext#setResponseCharacterEncoding
工作正常。当我使用ServletContext#setResponseCharacterEncoding
时,笔者认为HttpServletResponse#getWriter
returns 按其设置的字符编码对响应正文进行编码。
最佳答案
这是一个 Apache Tomcat 错误(特定于 getReader()
),由于您在 Tomcat 用户邮件列表上的报告,该错误将在 9.0.21 以后得到修复。
对于好奇的人,这里是 fix .
关于java - 为什么 'ServletContext#setRequestCharacterEncoding' 对 'HttpServletRequest#getReader' 没有影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56087155/
我有一个 JSP 网站,不是 Spring MVC,它有一个配置文件 web.xml。 我想要获取 web.xml 文件中的一些设置。 但是,我想从“源包”文件夹中的类中访问这些设置。 我知道我可以将
什么是ServletContext? 根据字面意思即Servlet上下文 服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象,这个对象是 全局唯一的,工程内部的所
我有一个类别列表,这些类别需要存在于应用程序的ServletContext范围内,因为该列表将由每个 View 访问,并且不需要修改。 我尝试在BootStrap.groovy的init方法中设置一个
ServletContext 是否在请求期间更新。例如我有这个代码: public void action(@Context ServletContext context) { Thread.sl
我正在将一些JSF代码从一个项目迁移到另一个项目,突然在我的新项目中ServletContext.TEMPDIR值失败了。我已经遍历了大多数文件,但这是唯一的错误,我不确定该在哪里修复。 tempdi
我正在尝试从服务访问servletContext(应用程序上下文)到集成测试中。 以下是我尝试让它进入我的集成测试的方法: import org.codehaus.groovy.grails.web.
我有 .NET 背景,正在尝试一些 Java(Servlet/JSP)基础知识。在.NET中,我们有ViewState、Session、Application变量。据我所知,Application 变
属性 repository 返回 null。 public class BaseServlet extends HttpServlet { protected MyPersistentMana
因此,我正在尝试建立一个在应用程序的多次使用(页面访问)中保持持久的 Mongo 连接。我厌倦了测试期间建立的所有这些连接,并且我想通过拥有单个持久连接来使用正确的过程。最佳实践等等。 这是我所拥有的
我正在我的 ServletContext 中存储一个 HashMap 对象。但是多个请求线程正在读取和修改这个 HashMap。 因为我相信 ServletContext 对象在请求线程之间共享,所以
您能否解释一下如何在我的Application 的子类中获取ServletContext 实例?可能吗?我试过像下面的代码片段那样做,但它似乎不起作用 - ctx 未设置: import javax.
我正在尝试手动引导 dispatcherservlet 作为练习。代码是 ServletRegistration.Dynamic dispatcher = container.addServlet(
这里的前提是,我不允许在这个网站上使用JavaScript或Cookies。 但是,我不想在每项至少需要密码 15-30 分钟的基本任务中询问用户密码。 我也不喜欢将密码保存到临时文件中,以防程序死掉
如果我使用 ../,为什么 ServletContext#getRealPath() 不会返回正确的路径 此代码有效:- System.out.println(context.getRealPath(
我正在使用上下文来共享登录 session 。我使用 setAttibute 函数。我知道 HttpSession 具有设置最大超时时间的属性。 是否可以以类似的方式设置上下文属性? ServletC
ServletConfig 和 ServletContext 接口(interface)有什么区别? 最佳答案 ServletConfig 参数是为特定 servlet 指定的,其他 servlet
我想听听你的意见。我正在开发一个 Servlet,它必须签署发送到端点的请求。 为了避免从服务器的 keystore 文件中读取、加载它并获取私钥,我在实现 ServletContextListene
我正在寻找一种方法将一些数据从数据库加载到 HashMap 中,并使该映射可用于所有根资源类和一些其他提供程序类(更准确地说是 ContainerRequestFilter 的实现)。我找到并实现了一
是否可以使用此API获取远程资源:ServletContext.getResourceAsStream() 例如:ServletContext.getResourceAsStream("http://
我的 RemoteServiceServlet 的日志输出(GWT) 在使用 getServletContext().log("anything"); 时不会显示在日志文件或标准输出中 对于依赖注入(
我是一名优秀的程序员,十分优秀!