Encodage des flux en J2EE

Publié le 18 décembre 2007 par Spawnrider @spawnrider

Si il y a bien un problème récurant en développement, c’est celui de l’encodage des caractères. On attend avec impatience le support de l’unicode avec PHP 6.… En J2EE, il n’y à pas le choix, il faut coder des filtre, à moins que je sois passé à côté de la solution miracle.

Une solution avec un filtre de servlet fourni par Seb qui fonctionne pour n’importe quel encodage:

1°) Il faut écrire un filtre de servlet qui va réencoder le flux avant envoi au client :

Code (java)
  1. import java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;
  2. import javax.servlet.ServletResponse;
  3. public class EncodingFilter implements javax.servlet.Filter {
  4. private String encoding;
  5. public void init(FilterConfig filterConfig) throws ServletException {
  6. this.encoding = filterConfig.getInitParameter("encoding");
  7. }
  8. public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,  ServletException {
  9. request.setCharacterEncoding(encoding);
  10. filterChain.doFilter(request, response);
  11. }
  12. public void destroy() {
  13. }
  14. }

2°) Il faut ensuite faire appel à ce filtre par l’intérmediaire d’un mapping dans le fichier web.xml comme suit :

Code (xml)
  1. <filter> <filter-name>Encoding Filter</filter-name>
  2. <filter-class>EncodingFilter</filter-class>
  3. <init-param>
  4. <param-name>encoding</param-name>
  5. <param-value>UTF-8</param-value>
  6. </init-param>
  7. </filter>
  8. <filter-mapping>
  9. <filter-name>Encoding Filter</filter-name>
  10. <url-pattern>/*</url-pattern>
  11. </filter-mapping>

Maintenant toutes les requêtes sont correctements lues avec l’encodage UTF-8.
Le filtre fonctionne tout autre encodage.

Une autre solution consiste à utiliser le servlet filter CharacterEncodingFilter dans le fichier web.xml afin de forcer l’encodage. Il est important de mettre ce filtre en premier dans la liste.

Code (xml)
  1. <web-app><filter>
  2. <filter-name>encodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. </web-app>

Voilà tout ! Pour ma part, j’ai utilisé la première solution qui à résolu pas mal de mes soucis au niveau des formulaires de saisies d’informations.