Paramètres de configuration des filtres personnalisés des connexions sortantes
La configuration d'une définition de filtre personnalisé des connexions sortantes inclut une section de métadonnées. Les développeurs peuvent l'utiliser comme un magasin pour les données de personnalisation spécifiques des filtres.
Exemple : Un développeur a implémenté un filtre personnalisé nommé
MyUserAgentRedirectionFilter. Le développeur utilise le filtre pour effectuer une redirection vers une URL différente si l'agent d'utilisateur correspond à un modèle d'agent utilisateur. Vous devez définir le modèle d'agent d'utilisateur et l'URL de redirection dans la configuration. Le fragment de code suivant illustre comment la fabrique de filtres extrait les paramètres de l'URL de redirection et des modèles d'agent d'utilisateur à partir de la configuration. L'exemple de fragment de code suppose que le paramètre de configuration du modèle d'agent d'utilisateur se trouve dans un paramètre de métadonnées sous le nom my_user_agent et l'URL de redirection se trouve dans un paramètre de métadonnées sous le nom my_redirection_url. public class MyUserAgentRedirectionFilterFactory implements OutboundServiceFilterFactory {
@Override
public OutboundServiceFilter newOutboundServiceFilter(URL url,
AjaxProxyConfiguration proxyConfig,
Map<String,String> metadata,
Context runtimeCtx) throws IOException {
// fetch the settings from the filter configuration.
String redirection_url = metadata.get("my_redirection_url");
String ua_pattern = metadata.get("my_user_agent");
return new MyCustomFilter(url, ua_patterns);
}
}L'exemple de code de filtre de connexion sortante ci-dessous vérifie si la chaîne de l'agent d'utilisateur de la connexion sortante actuelle correspond au modèle défini dans la configuration :public class MyUserAgentRedirectionFilter implements OutboundServiceFilter {
private final String redirectionUrl;
private final String pattern;
public MyUserAgentRedirectionFilter(String url, String ua_pattern) {
redirectionUrl = url;
patterns = ua_patterns;
}
@Override
public void preConnect(HttpURLConnection conn, FlowControl ctrl)
{
String userAgentString = conn.getRequestProperty("User-Agent");
if (this.shoudRedirect(userAgentString)) {
ctrl.setRedirect(redirectionUrl);
}
}
@Override
public void postConnect(HttpURLConnection conn,
Map<String, List<String>> modifiableResponseHeaders,
FlowControl ctrl) { }
@Override
public void handleError(ConnectionStatusEvent eventData,
FlowControl ctrl) { }
// helper method: check if this filter should apply.
// returns true if the given user agent matches with the given pattern
private boolean shouldRedirect(String ua) {
return Pattern.compile(pattern).matcher(ua).matches();
}
}Enfin, définissez la configuration. Dans l'exemple de scénario, vous souhaitez utiliser le filtre de redirection de l'agent d'utilisateur pour rediriger les demandes HTTP sortantes vers l'hôte distant http://www.my_remote_server.com/ si le client s'exécute sur un appareil Android ou iPhone. Vous souhaitez que les demandes sortantes qui sont soumises à partir d'appareils Android soient redirigées vers http://android.my_remote_server.com/index.html, et les demandes provenant d'un appareil iPhone soient réacheminées vers http://iphone.my_remote_server.com/index.html. Le fragment de configuration suivant en est un exemple : <policy url="http://www.my_remote_server.com/*" >
<actions>
<method>GET</method>
</actions>
<filter-chain>
<filter-factory>
<classname>sample.test.filters.MyUserAgentRedirectionFilterFactory</classname>
<meta-data>
<name>my_redirection_url</name>
<value>http://iphone.my_remote_server.com/index.html</value>
</meta-data>
<meta-data>
<name>my_user_agents</name>
<value>.*iPhone.*</value>
</meta-data>
</filter-factory>
<filter-factory>
<classname>sample.test.filters.MyUserAgentRedirectionFilterFactory</classname>
<meta-data>
<name>my_redirection_url</name>
<value>http://android.my_remote_server.com/index.html</value>
</meta-data>
<meta-data>
<name>my_user_agents</name>
<value>.*Android.*Mobile.*</value>
</meta-data>
</filter-factory>
</filter-chain>
</policy>