0
votes

For some reason my team uses spring XML configuration over Java Configuration. When I am implementing a new CorsFilter, I googled and found example Java Config like below:

@Component
public class CorsFilter extends OncePerRequestFilter {

   @Override
   protected void doFilterInternal(final HttpServletRequest request,
                                   final HttpServletResponse response,
                                   final FilterChain filterChain) throws ServletException, IOException {
       response.addHeader("Access-Control-Allow-Origin", "*");
       response
               .addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH, HEAD, OPTIONS");
       response.addHeader("Access-Control-Allow-Headers",
               "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
       response.addHeader("Access-Control-Expose-Headers",
               "Access-Control-Allow-Origin, Access-Control-Allow-Credentials");
       response.addHeader("Access-Control-Allow-Credentials", "true");
       response.addIntHeader("Access-Control-Max-Age", 10);
       filterChain.doFilter(request, response);
   }
}

But how to convert to equivalent Spring XML configuration? I know we can create a bean called corsFilter and set some property values. But how to override a parent method and perform operations with side effect inside an XML configuration? (like adding headers in above)

1

1 Answers

0
votes

If you want to move all header config inside the spring xml, you can create a Map object in the xml, then set as property to the CorsFilter and read the same in doFilterInternal method.

//add a spring util namespace xmlns:util="http://www.springframework.org/schema/util
//schemaLocation http://www.springframework.org/schema/util
<util:map id="headerMap" map-class="java.util.HashMap">
    <entry key="Access-Control-Allow-Origin">
        <value>*</value>
    </entry> ....so on
</util:map>

<bean id="corsFilter" class="CorsFilter">
    <property name="header" ref="headerMap"/>
</bean>

public class CorsFilter extends OncePerRequestFilter {
   Map<String,String> header;

   @Override
   protected void doFilterInternal(final HttpServletRequest request,
                                   final HttpServletResponse response,
                                   final FilterChain filterChain) throws ServletException, IOException {
        for(Entry<String,String> entry : header.entrySet()){
          response.addHeader(entry.getKey(), entry.getValue());
        }
       filterChain.doFilter(request, response);
   }
}