Tomcat filter to add additional attributes as Thread Local variables.
To preserve defined set of HTTP headers of a SCIM request in a thread local variable, so that those information are available in the User Store manger level. And to set response attributes to a thread local in the User Store Manager level, so that those additional response values can be injected in to the outgoing HTTP request's headers.
- Build and place the jar inside the
<IS_HOME>/repository/components/lib
directory. - Register the new filter in the
<IS_HOME>/repository/deployment/server/webapps/scim2/WEB-INF/web.xml
as below.
<web-app>
...
<filter>
<filter-name>SCIM2-additional-attribute-filter</filter-name>
<filter-class>com.wso2.sample.filter.SCIM2AdditionalAttributeAppenderFilter</filter-class>
<init-param>
<param-name>reqHeadersList</param-name>
<param-value>header1, header2, header3</param-value>
</init-param>
<init-param>
<param-name>resHeadersList</param-name>
<param-value>res-header1, res-header2, res-header3</param-value>
</init-param>
<init-param>
<param-name>HTTPMethods</param-name>
<param-value>DELETE</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SCIM2-additional-attribute-filter</filter-name>
<url-pattern>/Users/*</url-pattern>
</filter-mapping>
...
</web-app>
- In the
reqHeadersList
param, you can define all the headers(comma separated) that should be preserved to an ThreadLocal. - In the
resHeadersList
param , you can define all the headers that should be populated in the out going response. - In the
url-pattern
param, define the resource path you want thi filter to be engaged. HTTPMethods
value can be a comma separated HTTP methods where you want this filter to be engaged. The ThreadLocal response object should have the same keys as defined in theresHeadersList
list.- Your responsibility is to populate a thread local object from your Custom User Store manager with the key names
defined in the
resHeadersList
. So that, this filter can extract them from the ThreadLocal in the response flow and set as HTTP headers in the outgoing response. Sample implementation forUser store
side logic would be as follows.
import com.wso2.sample.filter.SCIM2AdditionalAttributeAppenderFilter;
public class ReadWriteLDAPUserStoreManager extends ReadOnlyLDAPUserStoreManager {
@Override
public void doDeleteUser(String userName) throws UserStoreException {
Map<String, String> additionalAttributes = SCIM2AdditionalAttributeAppenderFilter.getUserThreadLocal();
for (String key : additionalAttributes.keySet()) {
log.info(key + " : " + additionalAttributes.get(key));
}
additionalAttributes.clear();
additionalAttributes.put("res-header1", "response value 1");
additionalAttributes.put("res-header2", "response value 2");
SCIM2AdditionalAttributeAppenderFilter.setUserThreadLocal(additionalAttributes);
...
As the Tomcat filter's response is already committed, response were not reflected in the out going HTTP response. Hence the additional utils. You can refer to below link for more details on that. So : https://stackoverflow.com/questions/11025605/response-is-committing-and-dofilter-chain-is-broken