Java过滤器CharacterEncodingFilter位置问题。[通俗易懂]

Java过滤器CharacterEncodingFilter位置问题。[通俗易懂]转:https://segmentfault.com/a/1190000006184156前人就有的经验在开发javaweb应用的时候经常会遇到令人头痛的字符编码问题,期中一个就是客户端发送过来的请求的编码在请求头里并没有,开发人员需要在后端自己选择合适的encoding来解析request过来的参数。这个问题的解决办法很简单,就是写一个filter来过滤所有请求,然后设置一下req…

大家好,又见面了,我是你们的朋友全栈君。

转:https://segmentfault.com/a/1190000006184156

前人就有的经验

在开发java web应用的时候经常会遇到令人头痛的字符编码问题,期中一个就是客户端发送过来的请求的编码在请求头里并没有,开发人员需要在后端自己选择合适的encoding来解析request过来的参数。

这个问题的解决办法很简单,就是写一个filter来过滤所有请求,然后设置一下request的characterEncoding,比如:

public class CharacterEncodingFilter implements Filter {

  protected String encoding = "utf-8";

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
    request.setCharacterEncoding(encoding);
    chain.doFilter(request, response);
  }

  public void init(FilterConfig filterConfig) throws ServletException {
    String initEncoding = filterConfig.getInitParameter("encoding");
    if (Strings.isNotBlank(initEncoding)) {
      this.encoding = initEncoding;
    }
  }

  public void destroy() {
    encoding = null;
  }

}

把这个filter在web.xml里配置一下所拦截的url pattern就行了。

但是这里有个陷阱,整个web应用里,这个filter的拦截顺序必须是第一个,否则还是会出现乱码问题。这是因为(至少在tomcat里):

  1. request对象的parameter并不是一开始就解析的,它是等你第一次调用getParameter*等凡和获得请求参数有关的方法的时候才解析的

  2. paramter一旦被解析过一次,那就不会再次被解析

所以如果在CharacterEncodingFilter之前有另外一个filter,而这个filter调用了getParameter*方法,那么就有可能使用错误的encoding来解析,从而造成乱码问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158270.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vs生成动态库及使用动态库

    vs生成动态库及使用动态库动态库(.dll):动态库又称动态链接库英文为DLL,是DynamicLinkLibrary的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源。多个应用

    2022年9月25日
    4
  • Servlet-JSP入门

    Servlet-JSP入门JSP作用:主要作用是代替Servlet程序回传html页面的数据。因为Servlet程序回传html页面数据是一件非常繁琐的事情,开发成本和维护成本都很高。一般的Servlet回传页面如下protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(“text/html;charset=U

    2022年8月8日
    7
  • C语言中fprintf函数的使用介绍

    C语言中fprintf函数的使用介绍C语言中fprintf函数的使用介绍fprint函数的原型://fp为文件指针,format是输出控制字符串intfprintf(FILE*fp,char*format,…)下面是使用fscanf和fprintf函数实现一个学生信息输入和输出的demo#include<stdio.h>#include<stdlib.h>#include<st…

    2022年10月18日
    2
  • vim 常用命令

    vim 常用命令普通命令模式复制内容功能需求操作说明复制全部文本按下ggyG复制完成,注意:G必须大写粘贴内容命令操作说明p通过箭头移动光标到需要粘贴的位置,按下p将内容粘贴到光标后面P按下P将内容粘贴到光标前面删除内容功能需求操作说明D删除游标所在位置的字符到行尾全选文本按下ggvG全选文本,但是最后一行仅选中第一个字符,按下ggVG才是真正的全选文本删除按下dG删除光标所在行以及下面的

    2022年5月9日
    40
  • java求100以内的素数

    java求100以内的素数找出 1 100 之间所有的素数 质数 第一种方法 如何判断 i 是否是素数 1 找出 i 的所有的约数 并累加它们的和 例如 i 5 它的约数有 1 和 5 约数和 6 i 11 它的约数有 1 和 11 约数和 12 i 18 它的约数有 1 2 3 6 9 18 约数和 39 2 如果某个 i 的约数和 i 1 那么 i 就是素数 classPrimeIn 100 1 publicstatic String args 找出 1 100 之间所有的素

    2025年9月26日
    3
  • 阿里云服务器开放80端口「建议收藏」

    阿里云服务器开放80端口「建议收藏」阿里云服务器开放80端口1.先登录阿里云官网https://www.aliyun.com/2.点击控制台3.点击左边的三条杆4.点击进去之后,找到云服务器ECS5.点击蓝色字体的服务器名称6.找到安全组,安全组列表,加入安全组,配置规则7.点击入方向里的手动添加8.设置如下图所示的参数,最后记得保存哦9.至此,80端口就设置好了。因为我这里设置了Nginx,所以80端口会被占用10.我们在浏览器上访问,也可以验证成功…

    2022年10月2日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号