Servlet中文乱码 Tomcat8

发布于 2022-09-07 19:50:08 字数 1163 浏览 21 评论 0

问题:

Servlet中Get和Post获取到的中文参数都变成了乱码

代码:

JSP:
    <meta charset="UTF-8">
    <html>
    <body>
    <h2>Hello World!</h2>
    <form action="/login" method="post">
        username:<input type="text" name="username"><br/>
        pwd:<input type="password" name="pwd"><br/>
        <input type="submit" value="login" />
    </form>
    </body>
    </html>

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    String pwd = request.getParameter("pwd");
    System.out.println(username + " " + pwd);
}

截图:

clipboard.png
clipboard.png

尝试方法:

如图 request使用setCharacterEncoding设置为了UTF-8 并且当前页面编码也是UT-8 JSP文件也加入了UTF-8的编码声明 环境用的是Tomcat8

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

故事还在继续 2022-09-14 19:50:08

修改下conf下server
clipboard.png

手长情犹 2022-09-14 19:50:08
  1. 应该尽量避免在URL中使用非ASCII 字符,不然可能会碰到乱码问题,最好在我们的服务器端设置中的URIEncoding 和useBodyEncdingForURI 两个参数
  2. 一定要在第一次调用request.getParameter 方法之前就设置request .setCharacterEncoding(charset),否则你的POST 表单提交上来的数据也可能出现乱码
心如狂蝶 2022-09-14 19:50:08

很尴尬.... 浏览器默认采用了ASCII进行解码, 调整浏览器解码方式为UTF-8即可

守护在此方 2022-09-14 19:50:08

检查一下编码

  • 打开文件
  • 修改编码
code

by soarkey

格子衫的從容 2022-09-14 19:50:08

java文件,jsp文件编码方式最好都统一使用UTF-8编码。

对于post请求
设置request .setCharacterEncoding(“UTF-8”),这样中文才不会有乱码!

你可以统一写一个过滤器设置一下,如果使用spring-mvc的话 可以在web.xml中配置

<filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

对于get请求
如果你的请求是get,参数有中文的,比如 ?name=张上,按照如下处理
前端encodeURIComponent(encodeURIComponent(url)),对url进行二次编码。
后端:拿到参数值,使用URLDecoder.decode(s, "UTF-8")解码一下。这样方式确实可行的,答主在实际项目总使用过。
举个例子吧:
前端:

<script type="text/javascript">
   var url = "/xxx/param/test";
     
     var name = "张上";
     
     name = encodeURIComponent(name);
     name = encodeURIComponent(name);//二次编码
     alert(name);
     url = url + "?name="+name;
     window.location.href = url;
     </script>

后端:

@Controller
@RequestMapping(value="/param")
public class ParamController extends BaseController<ParamEntity> {
    /**
     * @throws UnsupportedEncodingException 
     * 
     */
    @RequestMapping(value="/test",method=RequestMethod.GET)
    public String test(@RequestParam("name") String name) throws UnsupportedEncodingException{
        name = URLDecoder.decode(name, "UTF-8");//实测,可以正确的得到中文。
        System.out.println(name);
        return "index";
    }
}

注意:get请求有中文参数,可以指定容器使用何种编码规则来解码提交的参数(有人回答使用这种方式,即修改tomcat 配置文件中的Connector中的URIEncoding参数),但是这种做法不建议使用,推荐使用二次编码吧。
为什么需要二次编码?可以看如下博文:
eURIComponent编码2次

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文