Saturday, December 6, 2014

Whitespace trimming in Struts2 using filter

Source link: https://app.box.com/s/j7sji6xhn1sc26rayosi
  • Create a filter for trimming
  • Add the filter to web.xml

1. Create filter for trimming

When you use the struts2 filter org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  use should create a Request wrapper extend StrutsRequestWrapper
The full WhitespaceFilter class:
 package com.vmtram.struts2.filters;  
 import java.io.IOException;  
 import java.util.HashMap;  
 import java.util.Iterator;  
 import java.util.Map;  
 import javax.servlet.Filter;  
 import javax.servlet.FilterChain;  
 import javax.servlet.FilterConfig;  
 import javax.servlet.ServletException;  
 import javax.servlet.ServletRequest;  
 import javax.servlet.ServletResponse;  
 import javax.servlet.http.HttpServletRequest;  
 import org.apache.struts2.dispatcher.StrutsRequestWrapper;  
 public class WhitespaceFilter implements Filter {  
      public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,  
                ServletException {  
           HttpServletRequest request = (HttpServletRequest) req;  
           chain.doFilter(new RequestWrapper(request), res);  
      }  
      @Override  
      public void destroy() {  
      }  
      @Override  
      public void init(FilterConfig arg0) throws ServletException {  
      }  
      class RequestWrapper extends StrutsRequestWrapper {  
           public RequestWrapper(HttpServletRequest request) {  
                super(request);  
           }  
           @Override  
           public Map<String, String[]> getParameterMap() {  
                Map<String, String[]> paramMapIn = super.getParameterMap();  
                Map<String, String[]> paramMapOut = new HashMap<String, String[]>();  
                Iterator<String> keys = paramMapIn.keySet().iterator();  
                while (keys.hasNext()) {  
                     String key = keys.next();  
                     String[] values = paramMapIn.get(key);  
                     if (values.length == 1) {  
                          String value = values[0].trim();  
                          paramMapOut.put(key, new String[] { value });  
                     } else {  
                          paramMapOut.put(key, values);  
                     }  
                }  
                return paramMapOut;  
           }  
      }  
 }  

Because the implement doFilter of StrutsPrepareAndExecuteFilter  will make a wrapRequest for input ServletRequest.
 ...  
         prepare.setEncodingAndLocale(request, response);  
         prepare.createActionContext(request, response);  
         prepare.assignDispatcherToThread();  
         request = prepare.wrapRequest(request);  
         ActionMapping mapping = prepare.findActionMapping(request, response, true);  
 ...  

Have a checking in the implememt of wrapRequest
  if (request instanceof StrutsRequestWrapper) {  
       return request;  
     }  

If RequestWrapper of user extends HttpServletRequestWrapper it cannot invoke to user getParameterMap() method to trim() the  parameters.

2. Add filter to web.xml

     <filter>  
           <filter-name>whitespaceFilter</filter-name>  
           <filter-class>com.vmtram.struts2.filters.WhitespaceFilter</filter-class>  
      </filter>  
      <filter-mapping>  
           <filter-name>whitespaceFilter</filter-name>  
           <url-pattern>/*</url-pattern>  
      </filter-mapping>  

The results:

Relate: 


  • Create Struts2 project with eclipse and maven
  • Support UTF-8 in java web

  • No comments:

    Post a Comment