[JAVA] J'ai créé un domaine api avec Spring Framework. Partie 2

Cliquez ici pour les paramètres précédents

J'ai créé un domaine API avec Spring Framework. Partie 1

Préparez votre propre filtre.

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>

com.TsugaruInfo.config.SubDomainFilter C'est le filtre original que nous allons faire. Ce filtre est configuré pour accepter toutes les URL.

Implémenter une classe de filtre

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)

J'y accéderai réellement.

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

image.png

api. Lors de l'accès à localhost

image.png

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

référence

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

J'ai créé un domaine api avec Spring Framework. Partie 2
J'ai créé un domaine api avec Spring Framework. Partie 1
Création d'un framework Web de type Atlassian
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 2 (édition client)
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 1)
Lier l'API avec Spring + Vue.js
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Spring avec Kotorin - 4 Conception d'API REST
Créez une application avec Spring Boot 2
Test de l'API REST à l'aide de REST Assured Part 2
J'ai essayé d'implémenter un client OAuth avec Spring Boot / Security (connexion LINE)
02. J'ai créé une API pour me connecter de Spring Boot à MySQL (My Batis)
J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.
Créez une application avec Spring Boot
J'ai essayé d'implémenter l'API Rails avec TDD par RSpec. part2 -authentification de l'utilisateur-
Je voulais faciliter la programmation JavaFX avec Spring Framework
J'ai essayé GraphQL avec Spring Boot
J'ai essayé Flyway avec Spring Boot
Contrôleur de cadre de test Spring avec Junit
J'ai créé un serveur écologique avec scala
Notes de l'étude Spring Framework [Partie 1] Conteneur DI
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
Configurer des microservices avec Spring Cloud (4): API Gateway
Rétrograder une application existante créée avec les rails 5.2.4 vers 5.1.6
Créez une API JSON prenant en charge le cryptage RSA avec wicket
J'ai créé un client API pour Nature Remo
Obtenez la partie Body de HttpResponse avec Spring Filter
J'ai essayé de lier JavaFX et Spring Framework.
Obtenez des données avec une API créée par la commande curl
Je voulais classer la botte à ressort dans un multi-projet
◆ Obtenez l'API créée par Spring Boot à partir de React
Créer un serveur API Web avec Spring Boot
Gérez le cross-domain JSON avec Play Framework