前言

  • spring 4.3.4.RELEASE
  • CharacterEncodingFilter : Spring MVC 提供的字符集过滤器,用于处理项目中的乱码问题
  • 项目比较老,大部分url使用的是GBK编码,少量url使用UTF-8编码。
  • 需要对 CharacterEncodingFilter 设置例外。即,少量url不要进行 CharacterEncodingFilter 过滤。

CharacterEncodingFilter设置

  <filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</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>

url-pattern很霸气,过滤所有。
forceEncoding更霸气,强制编码格式为GBK。
为什么这么设置不说了(很显然这样让charset为UTF-8的JS很受伤),就说怎么办吧。

受伤的JS

<script type="text/javascript" language="javascript" src="../codebase/laydate/laydate.js"  charset="UTF-8"></script>

CharacterEncodingFilter添加例外

方法1(推荐):filter-mapping添加例外

嗯~,filter-mapping添加例外是个好办法。

  <!-- 解决编码问题过滤器 --><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</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><!-- CharacterEncodingFilter过滤器添加例外 --><filter><filter-name>characterEncodingFilter_utf8</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_utf8</filter-name><url-pattern>/codebase/laydate/laydate.js</url-pattern></filter-mapping>

方法2:告知CharacterEncodingFilter不用再处理了

根据CharacterEncodingFilter代码显示,在request的Attribute中,增加名为filter-name.FILTERED,值为TRUE的Attribute时,会跳过过滤器。
本文中需要增加名为characterEncodingFilter.FILTERED的Attribute。
增加名为characterEncodingFilter.FILTERED的Attribute的方法则是:在characterEncodingFilter执行前,再增加一个Filter。该Filter向request增加名为characterEncodingFilter.FILTERED的Attribute。(该Filter需要自己写,此处暂不提供)

CharacterEncodingFilter的相关代码如下:

CharacterEncodingFilter的相关代码:

public class CharacterEncodingFilter extends OncePerRequestFilter {...
}

OncePerRequestFilter的相关代码:

public abstract class OncePerRequestFilter extends GenericFilterBean {/*** Suffix that gets appended to the filter name for the* "already filtered" request attribute.* @see #getAlreadyFilteredAttributeName*/public static final String ALREADY_FILTERED_SUFFIX = ".FILTERED";/*** This {@code doFilter} implementation stores a request attribute for* "already filtered", proceeding without filtering again if the* attribute is already there.* @see #getAlreadyFilteredAttributeName* @see #shouldNotFilter* @see #doFilterInternal*/@Overridepublic final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)throws ServletException, IOException {if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {throw new ServletException("OncePerRequestFilter just supports HTTP requests");}HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName();boolean hasAlreadyFilteredAttribute = request.getAttribute(alreadyFilteredAttributeName) != null;if (hasAlreadyFilteredAttribute || skipDispatch(httpRequest) || shouldNotFilter(httpRequest)) {// Proceed without invoking this filter...filterChain.doFilter(request, response);}else {// Do invoke this filter...request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);try {doFilterInternal(httpRequest, httpResponse, filterChain);}finally {// Remove the "already filtered" request attribute for this request.request.removeAttribute(alreadyFilteredAttributeName);}}}/*** Return the name of the request attribute that identifies that a request* is already filtered.* <p>The default implementation takes the configured name of the concrete filter* instance and appends ".FILTERED". If the filter is not fully initialized,* it falls back to its class name.* @see #getFilterName* @see #ALREADY_FILTERED_SUFFIX*/protected String getAlreadyFilteredAttributeName() {String name = getFilterName();if (name == null) {name = getClass().getName();}return name + ALREADY_FILTERED_SUFFIX;}...
}

GenericFilterBean的相关代码:

public abstract class GenericFilterBean implements Filter, BeanNameAware, EnvironmentAware,EnvironmentCapable, ServletContextAware, InitializingBean, DisposableBean {/*** Make the name of this filter available to subclasses.* Analogous to GenericServlet's {@code getServletName()}.* <p>Takes the FilterConfig's filter name by default.* If initialized as bean in a Spring application context,* it falls back to the bean name as defined in the bean factory.* @return the filter name, or {@code null} if none available* @see javax.servlet.GenericServlet#getServletName()* @see javax.servlet.FilterConfig#getFilterName()* @see #setBeanName*/@Nullableprotected String getFilterName() {return (this.filterConfig != null ? this.filterConfig.getFilterName() : this.beanName);}...
}

spring mvc字符编码过滤器 CharacterEncodingFilter ,添加例外url相关推荐

  1. 在Spring MVC Web应用程序中添加社交登录:集成测试

    我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但是它并不能真正告诉我们我们的应用程序是否正常运行. 这就是 ...

  2. 在Spring MVC Web应用程序中添加社交登录:单元测试

    Spring Social 1.0具有spring-social-test模块,该模块为测试Connect实现和API绑定提供支持. 该模块已从Spring Social 1.1.0中删除,并由 Sp ...

  3. java 字符过滤器_Java Web---登录验证和字符编码过滤器

    什么是过滤器? 在Java Web中,过滤器即Filter.Servlet API中提供了一个Filter接口(javax.servlet.Filter).开发web应用时,假设编写的Java类实现了 ...

  4. Spring MVC 中 HandlerInterceptorAdapter过滤器的使用

    一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理.后处理.  Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度. ...

  5. 字符编码过滤器中对特殊的路径进行特殊处理

    我做在线打开的时候将word文档转换为html文件,保存在temp文件夹下,然后通过链接打开html文件实现"在线打开word"的功能,结果产生了乱码,原因是在windows系统下 ...

  6. jsp里面声明了utf-8格式,也写了字符编码过滤器,数据库编码也是utf-8,就连java.......

    打开Tomcat的server.xml文件的时候发现我的配置是这样的 maxSpareThreads="75" enableLookups="false" re ...

  7. Spring MVC【入门】就这一篇

    MVC 设计概述 在早期 Java Web 的开发中,统一把显示层.控制层.数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,我们称之为 Model1: 出现的弊端: JSP 和 Ja ...

  8. Spring MVC【入门】就这一篇!

    MVC 设计概述 在早期 Java Web 的开发中,统一把显示层.控制层.数据层的操作全部交给 JSP 或者JavaBean 来进行处理,我们称之为 Model1: 出现的弊端: JSP 和 Jav ...

  9. Spring mvc 内置编码过滤器原理解析

    在Spring mvc框架中是如何解决从页面传来的字符串的编码问题的呢? 下面我们来看看Spring框架给我们提供过滤器CharacterEncodingFilter. web.xml 中 添加如下配 ...

最新文章

  1. Java如何打印异常的堆栈?
  2. Android ListView 设置
  3. 密码学专题 鉴别协议|实际应用的混合协议
  4. Spring Boot2 整合 Shiro ,两种方式全总结!
  5. C#Convert.ToInt32(byte)方法-将字节值转换为int
  6. 动态计算未知盒子的高度
  7. 用户微信好友关系属于个人隐私吗?深圳南山法院说不属于...
  8. 几道查询树上点之间的路径的题目
  9. 索引sql server_SQL Server索引设计基础和准则
  10. MySQL集群架构:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高性能-技术流ken
  11. 光流(四)--Kanade-Lucas-Tomasi(KLT)目标跟踪
  12. 连锁零售多门店收银系统源码
  13. ANSYS Products 2020中文版
  14. 迅雷手机版苹果版_IOS手机迅雷下载(支持苹果手机和ipad)
  15. c语言写死循环程序,通过简单的例子看c程序死循环
  16. 数学建模:整数规划—指派模型与匈牙利算法
  17. 转载:一名程序员的磨练
  18. AVPro Video官网下载
  19. 头条/抖音小程序内容安全检测(违规词过滤)
  20. 一个女程序员的心酸和无奈

热门文章

  1. 织梦dedecsm系统企业简介类单栏目模版如何修改和调用
  2. [翻译]Triggerless design.md
  3. KVM虚拟化实战精讲[第五章 利用virsh对虚拟机管理]
  4. 使用uploadify上传图片时返回“Cannot read property 'queueData' of undefined”
  5. NopCommerce开源项目中很基础但是很实用的C# Helper方法
  6. 使用Container.ItemIndex获取Repeater、Gridview行的序号的简单方法
  7. JAVA 通过url下载图片保存到本地(亲测)
  8. mysql数据导入导出方法总结
  9. php 实现进制相互转换
  10. Gin实际编写中间件