对Servlet 中 request.setEncoding("utf-8")的分析
首先要知道这里的request为HttpServletRequest,如果我们打印request的话,发现打印出的类型为 RequestFacade(package org.apache.catalina.connector; public class RequestFacade implements HttpServletRequest ) ,这里的RequestFacade对象实现了HttpServletRequest接口。
通过源码有如下发现:
protected Request request=null;
(package org.apache.catalina.connector)
public RequestFacade(Request request) {
this.request = request;
}
request对象通过RequestFacade对象的构造方法来设值
request.setCharacterEncoding(env);
2、package org.apache.catalina.connector
public class Request implements HttpServletRequest
public void setCharacterEncoding(String enc)
throws UnsupportedEncodingException {
if (usingReader)
return;
// 确保编码格式可用
byte buffer[] = new byte[1];
buffer[0] = (byte) 'a';
String dummy = new String(buffer, enc);
// Save the validated encoding
coyoteRequest.setCharacterEncoding(enc);
}
在这里发现有个usingReader变量,默认值为false,
protected boolean usingReader = false;
在如下两个地方将usingReader设置为true
protected boolean usingInputStream = false;
public ServletInputStream getInputStream() throws IOException {
if (usingReader)
throw new IllegalStateException
(sm.getString("coyoteRequest.getInputStream.ise"));
usingInputStream = true;
if (inputStream == null) {
inputStream = new CoyoteInputStream(inputBuffer);
}
return inputStream;
}
public BufferedReader getReader() throws IOException {
if (usingInputStream)
throw new IllegalStateException
(sm.getString("coyoteRequest.getReader.ise"));
usingReader = true;
inputBuffer.checkConverter();
if (reader == null) {
reader = new CoyoteReader(inputBuffer);
}
return reader;
}
3、protected org.apache.coyote.Request coyoteRequest;
coyoteRequest.setCharacterEncoding(enc);
public final class Request
public void setCharacterEncoding(String enc) {
this.charEncoding = enc;
}
private String charEncoding = null;
在这里我们可以知道,request对象的setCharacterEncoding方法只是将charEncoding属性设置为enc
到现在为止request的编码设置已经完成了,但是究竟在哪使用呢,下面就来看看
request通过如下几个方法来取得请求的参数:
package org.apache.catalina.connector;
public String getParameter(String name)
public String[] getParameterValues(String name)
public Map getParameterMap()
public Enumeration getParameterNames()
下面来看一下它们的具体实现:
public String getParameter(String name) {
if (request == null) {
throw new IllegalStateException(
sm.getString("requestFacade.nullRequest"));
}
if (Globals.IS_SECURITY_ENABLED){
return (String)AccessController.doPrivileged(
new GetParameterPrivilegedAction(name));
} else {
return request.getParameter(name);
}
}
同样的道理 RequestFacade.getParameter(name)方法来调用Request.getParameter(name)
public String getParameter(String name) {
if (!parametersParsed)
parseParameters();
return coyoteRequest.getParameters().getParameter(name);
}
可以发现取参数的时候首先会将所有的参数解析出来
开始定义时 protected boolean parametersParsed = false;
相关推荐
在Servlet开发中,`request.setEncoding("utf-8")`是一个关键操作,它用于设置HTTP请求的字符编码,确保从客户端传递过来的数据(如表单数据、URL参数等)能够正确解析并处理中文或其他非ASCII字符。这个操作涉及到...
- 在`web.xml`中注册这个过滤器,并配置初始化参数`encoding`为`UTF-8`,这样所有经过该过滤器的请求都会被设置为UTF-8编码。 ```xml <filter-name>SetCharacterEncodingFilter</filter-name> <filter-class>...
当你在过滤器中调用`request.setCharacterEncoding("UTF-8")`时,它会确保POST请求的数据按照UTF-8格式进行解码,从而避免乱码的出现。这是因为POST请求的数据是在请求体中传递的,可以被这个方法覆盖其默认编码。 ...
request.setCharacterEncoding("UTF-8"); ``` 2. **设置响应编码**:同样,我们也需要设置HttpServletResponse的编码,确保响应内容正确编码。可以在`processActionCreate`或`processForwardedRequest`等方法中添加...
<%request.setCharacterEncoding("utf-8");%>` 这段代码设置了页面的编码方式为 UTF-8,并将 request 对象的编码方式设置为 UTF-8。 2. 如果使用 Servlet,在 doPost 或 doGet 方法的第一行添加以下代码: `...
request.setCharacterEncoding("UTF-8"); ``` 这样做的目的是确保服务器能够正确解读客户端发送过来的请求参数。如果没有正确设置,可能会导致客户端传来的中文参数出现乱码。 #### 4. response.setCharacter...
例如,在jsp页面中指定request.setCharacterEncoding("UTF-8"),那么服务器将使用UTF-8编码对客户端请求进行重新编码。 4. 使用response.setCharacterEncoding方法 使用response.setCharacterEncoding方法可以解决...
request.setCharacterEncoding("UTF-8"); ``` 这样,Servlet容器会在解析请求参数时自动使用UTF-8编码,避免了手动转码的需要。但请注意,这种方法只能在读取请求参数之前调用,否则将无效。 总结起来,这个`doGet...
request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); // 如果需要处理已经乱码的参数,可以使用以下方式 username = new String(username.getBytes("iso8859-1"), ...
// request.setCharacterEncoding("utf-8"); // //接收method属性的值 // String methodName = request.getParameter("method"); // // //根据method属性的值调用相应的方法 // if("login".equals(methodName)){ // ...
在Servlet容器的配置中,可以设置全局的字符编码,比如在Spring Boot中,可以通过配置文件`application.properties`设置`server.servlet.encoding.charset=UTF-8`。 通过以上步骤,基本可以解决JSP中出现的中文...
3. request.setCharacterEncoding("UTF-8") request.setCharacterEncoding 方法用来指定对客户端请求进行编码的方式。该方法用来指定对浏览器发送来的数据进行编码的编码方式。 4. response.setCharacterEncoding...
例如,如果客户端以UTF-8编码发送数据,那么在服务器端也应使用`request.setCharacterEncoding("UTF-8")`来确保数据的正确解读。 ### response.setCharacterEncoding("UTF-8") 与`request.setCharacterEncoding`相...
`request.setCharacterEncoding("UTF-8");` 这条代码指定了 Servlet 请求的编码格式为 UTF-8,从而确保中文字符的正确显示。 Filter 配置 除此之外,我们还可以使用 Filter 来解决中文乱码问题。我们可以创建一个...
request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); chain.doFilter(request, response); return; } request.set...
在 servlet 中添加 request.setCharacterEncoding("UTF-8"); 和 response.setContentType("text/html;charset=UTF-8"); 语句,以便设置正确的编码方式。 第五步:在获取参数时,使用正确的编码方式来转换参数值。...
同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)所以,在无论你在JSP中设置response.setCharacterEncoding("UTF-8")或response.setCharacterEncoding("GBK"),浏览器均能正确显示中文...
与在JSP页面中类似,在Servlet中也需设置`request`对象的字符集为UTF-8,以便正确读取中文参数。 #### 总结 综上所述,解决JSP+Servlet开发中的中文乱码问题主要依赖于确保整个系统中各个部分都使用相同的字符集。...
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ``` 此外,这个重写的Filter还用于“屏蔽敏感字符”。这涉及到输入验证和安全防护。敏感字符可能包括SQL注入攻击...
request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); userDao = new UserDao(); String str = request.getRequestURI(); str = str.substring(str.lastIndexOf("/") + 1); // ...