J'ai créé un domaine API avec Spring Framework. Partie 1
Il semble que Spring n'ait pas de fonction pour distribuer l'accès par sous-domaine. Ainsi, vous pouvez le résoudre en ** ajoutant un en-tête spécial lors de l'accès à un sous-domaine spécifique **.
Pour cela, commençons par faire fonctionner le filtre que vous avez fait fonctionner lorsque sous-domaine de "api". Tout d'abord, ajoutez un filtre à web.xml.
web.xml
<!--Filtrer par sous-domaine-->
<filter>
<filter-name>subDomainFilter</filter-name>
<filter-class>com.TsugaruInfo.config.SubDomainFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>subDomainFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
Maintenant, implémentons un filtre de sous-domaine. Les filtres peuvent être créés en héritant de ** GenericFilterBean **. GenericFilterBean doit remplacer ** doFilter **, "Enfin, exécutez le doFilter de FilterChain et renvoyez la requête et la réponse au contrôleur." Il a la propriété de.
En d'autres termes, vous pouvez joindre un en-tête à cette demande et le renvoyer au contrôleur. Alors ça ressemble à ça.
SubDomainFilter.java
public class SubDomainFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
//TODO talon de méthode généré automatiquement
//Emballage de sous-domaine Materialise
SubDomainHttpServletRequestWrapper httpRequest =
new SubDomainHttpServletRequestWrapper((HttpServletRequest) request);
//Obtenir un sous-domaine
String subDomain = getSubDomain(httpRequest);
//Si le sous-domaine api est acquis avec succès, exécutez le filtre et quittez.
if(subDomain != null) {
httpRequest.addHeader("X-SUBDOMAIN", subDomain);
}
else {
//Autres en-têtes sans accès au sous-domaine
httpRequest.addHeader("X-SUBDOMAIN", "topDomain");
}
filterChain.doFilter(httpRequest, response);
}
/**
*Partie de jugement d'en-tête Juge si l'accès est en tant qu'API
* @param httpRequest
* @return
*/
private String getSubDomain(HttpServletRequest httpRequest) {
List<String> subdomains = new ArrayList<String>();
//Le sous-domaine est "api".Renvoie une chaîne API au démarrage par localhost
if(httpRequest.getHeader("host").matches("api.*")) {
return "api";
}
return null;
}
}
"Quand il y a un caractère" api "dans l'en-tête" host "de la requête, j'essaye de modifier mon propre en-tête, X-SUBDOMEIN.
Donc, il y a des classes qui manquent. HttpRequest n'a pas la possibilité de modifier les en-têtes. Je crée donc une classe wrapper pour HttpRequest.
SubDomainHttpServletRequestWrapper.java
/**
*Une sous-classe avec getHeader et addHeader ajoutés aux opérations de sous-domaine
* @author nozawa
*
*/
public class SubDomainHttpServletRequestWrapper extends HttpServletRequestWrapper {
//Les informations d'en-tête sont copiées sur cette carte
private Map<String, String> headers = new HashMap<String, String>();
public SubDomainHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
//Obtenir l'en-tête de la demande
Enumeration<String> headers_head = request.getHeaderNames();
//Obtenir le nom de l'en-tête
while(headers_head.hasMoreElements()){
String header = headers_head.nextElement();
Enumeration<String> values = request.getHeaders(header);
//Définir la valeur d'en-tête
while(values.hasMoreElements()) {
String value = values.nextElement();
headers.put(header, value);
}
}
}
/**
*En-tête ajouté
* @param name
* @param value
*/
public void addHeader(String name, String value){
headers.put(name, value);
}
/**
*Obtenir l'en-tête
*/
public String getHeader(String name) {
if(headers.containsKey(name)) {
return headers.get(name);
}
return ((HttpServletRequest)getRequest()).getHeader(name);
}
}
Cette classe wrapper copie les informations d'en-tête stockées en tant que valeur fixe du type d'énumération dans la mappe de sa propre classe. Le contrôleur considère les champs de cette classe comme des informations d'en-tête, il serait donc bien de pouvoir éditer cette carte. (Peut-être que c'est un peu maladroit, s'il vous plaît dites-moi s'il y a un moyen efficace)
Créons un contrôleur pour l'API et y accédons!
Premier, Créez deux méthodes de contrôleur avec la même URL.
APIPictureController.java
@RequestMapping(value="/api/picture", produces="application/json;charset=UTF-8")
@RestController
public class APIPictureController {
@RequestMapping(value = "/picture_api", method = RequestMethod.GET, headers = "X-SUBDOMAIN=api")
public String apiStreaming( HttpServletRequest request) {
request.getHeaderNames();
return "{\"text\":\"api_Sucessed\"}";
}
@RequestMapping(value = "/picture_api", method = RequestMethod.GET)
public String normalStreaming( HttpServletRequest request) {
request.getHeaderNames();
return "{\"text\":\"api_notActivate\"}";
}
Ces deux méthodes sont triées en fonction de la valeur du champ d'en-têtes qui existe dans la demande. C'est un mécanisme que la méthode api ne fonctionne que lorsque X-SUBDOMEIN est une api.
Accédons-y réellement.
Lors de l'accès à localhost
api. Lors de l'accès à localhost
Le sous-domaine nous a permis de compter l'accès. ヾ (.> ﹏ <.) Non Tout ce que vous avez à faire est d'écrire la fonction que vous souhaitez écrire
J'ai honte de dire que cela n'a pas tellement fonctionné, alors je le change.
Triez les sous-domaines avec @RequestMapping de Spring MVC. http://blog.katty.in/3025
Recommended Posts