[JAVA] Ich habe mit Spring Framework eine API-Domain erstellt. Teil 2

Klicken Sie hier für die vorherigen Einstellungen

Ich habe eine API-Domain mit Spring Framework erstellt. Teil 1

Bereiten Sie Ihren eigenen Filter vor.

Es scheint, dass Spring keine Funktion hat, um den Zugriff nach Subdomain zu verteilen. Sie können es also lösen, indem Sie beim Zugriff auf eine bestimmte Subdomain einen speziellen Header hinzufügen.

Lassen Sie uns dafür zuerst den Filter, den Sie erstellt haben, als Subdomain von "api" verwenden. Fügen Sie zunächst einen Filter zu web.xml hinzu.

web.xml


  <!--Filter für Subdomain-->
  <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 Ist der ursprüngliche Filter, den wir machen werden. Dieser Filter akzeptiert alle URLs.

Implementieren Sie eine Filterklasse

Lassen Sie uns nun einen Subdomain-Filter implementieren. Filter können durch Erben von ** GenericFilterBean ** erstellt werden. GenericFilterBean muss ** doFilter ** überschreiben, "Führen Sie abschließend den doFilter von FilterChain aus und senden Sie die Anforderung und Antwort an den Controller zurück." Es hat die Eigenschaft von.

Mit anderen Worten, Sie können dieser Anforderung einen Header hinzufügen und an die Steuerung zurücksenden. Dann sieht es so aus.

SubDomainFilter.java



public class SubDomainFilter extends GenericFilterBean {
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		//TODO automatisch generierter Methodenstub
		
		//Subdomain-Wrapper materialisieren
		SubDomainHttpServletRequestWrapper httpRequest =
				new SubDomainHttpServletRequestWrapper((HttpServletRequest) request);
		
		//Subdomain abrufen
		String subDomain = getSubDomain(httpRequest);
		
		//Wenn die API-Subdomain erfolgreich erfasst wurde, führen Sie den Filter aus und beenden Sie ihn.
	if(subDomain != null) {
			httpRequest.addHeader("X-SUBDOMAIN", subDomain);
		}
	else {
		//Andere Header, wenn kein Subdomain-Zugriff möglich ist
		httpRequest.addHeader("X-SUBDOMAIN", "topDomain");
	}

	filterChain.doFilter(httpRequest, response);
	}
		
	/**
	 *Header-Urteilsteil Beurteilt, ob der Zugriff als API erfolgt
	 * @param httpRequest
	 * @return
	 */
	private String getSubDomain(HttpServletRequest httpRequest) {
		List<String> subdomains = new ArrayList<String>();
		
		//Die Subdomain ist "api".Gibt eine API-Zeichenfolge zurück, wenn mit localhost begonnen wird
				if(httpRequest.getHeader("host").matches("api.*")) {
					return "api";
				}
				
				return null;
	}
}

"Wenn sich im" Host "-Header der Anfrage ein Zeichen" api "befindet, versuche ich, meinen eigenen Header X-SUBDOMEIN zu bearbeiten.

Es fehlen also einige Klassen. HttpRequest kann keine Header bearbeiten. Also mache ich eine Wrapper-Klasse für HttpRequest.

SubDomainHttpServletRequestWrapper.java



/**
 *Eine Unterklasse mit getHeader und addHeader, die zu Unterdomänenoperationen hinzugefügt wurde
 * @author nozawa
 *
 */
public class SubDomainHttpServletRequestWrapper extends HttpServletRequestWrapper {

	//Header-Informationen werden in diese Karte kopiert
	private Map<String, String> headers = new HashMap<String, String>();
	
	public SubDomainHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
		
		//Anforderungsheader abrufen
		Enumeration<String> headers_head = request.getHeaderNames();
				
		//Headernamen abrufen
				while(headers_head.hasMoreElements()){
					String header = headers_head.nextElement();
					Enumeration<String> values = request.getHeaders(header);
		//Kopfwert einstellen
				while(values.hasMoreElements()) { 
					String value = values.nextElement();
					headers.put(header, value);
					}
				}
	}

	
	/**
	 *Header hinzugefügt
	 * @param name
	 * @param value
	 */
	public void addHeader(String name, String value){
		headers.put(name, value);
	}
	
	/**
	 *Header abrufen
	 */
	public String getHeader(String name) {
		if(headers.containsKey(name)) {
			return headers.get(name);
		}
		
		return ((HttpServletRequest)getRequest()).getHeader(name);
		
	}
}


Diese Wrapper-Klasse kopiert die als fester Wert des Aufzählungstyps gespeicherten Header-Informationen in die Zuordnung ihrer eigenen Klasse. Der Controller betrachtet die Felder dieser Klasse als Header-Informationen, daher wäre es schön, diese Map bearbeiten zu können. (Vielleicht ist es etwas klobig, bitte sag mir, ob es einen effizienten Weg gibt)

Ich werde tatsächlich darauf zugreifen.

Lassen Sie uns einen Controller für die API erstellen und darauf zugreifen!

Zuerst, Erstellen Sie zwei Controller-Methoden mit derselben 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\"}";
	}

Diese beiden Methoden werden nach dem Wert des in der Anforderung vorhandenen Header-Felds sortiert. Es ist ein Mechanismus, dass die API-Methode nur funktioniert, wenn X-SUBDOMEIN API ist.

Lassen Sie uns tatsächlich darauf zugreifen.

Beim Zugriff auf localhost

image.png

api. Beim Zugriff auf localhost

image.png

Die Subdomain ermöglichte uns den Zugriff. ヾ (.> ﹏ <.) Nr Sie müssen lediglich die Funktion schreiben, die Sie schreiben möchten

Referenz

Ich schäme mich zu sagen, dass es nicht so viel funktioniert hat, also ändere ich es.

Sortieren Sie Subdomains mit @RequestMapping von Spring MVC. http://blog.katty.in/3025

Recommended Posts

Ich habe mit Spring Framework eine API-Domain erstellt. Teil 2
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 1
Erstellt ein Atlassian-ähnliches Webframework
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 1 (API Edition)
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 2 (Client Edition)
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 1).
API mit Spring + Vue.js verknüpfen
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Feder mit Kotorin --4 REST API Design
Erstellen Sie eine App mit Spring Boot 2
REST-API-Test mit REST Assured Part 2
Ich habe versucht, einen OAuth-Client mit Spring Boot / Security (LINE-Anmeldung) zu implementieren.
02. Ich habe eine API erstellt, um eine Verbindung von Spring Boot zu MySQL (My Batis) herzustellen.
Ich habe ein einfaches Suchformular mit Spring Boot + GitHub Search API erstellt.
Erstellen Sie eine App mit Spring Boot
Ich habe versucht, die Rails-API mit TDD von RSpec zu implementieren. Teil2 -Benutzerauthentifizierung-
Ich wollte die JavaFX-Programmierung mit dem Spring Framework vereinfachen
Ich habe GraphQL mit Spring Boot ausprobiert
Ich habe Flyway mit Spring Boot ausprobiert
Testen Sie den Spring Framework Controller mit Junit
Ich habe einen Öko-Server mit Scala gemacht
Anmerkungen zur Spring Framework-Studie [Teil 1] DI-Container
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Konfigurieren Sie Microservices mit Spring Cloud (4): API Gateway
Downgrade einer vorhandenen App, die mit Rails 5.2.4 erstellt wurde, auf 5.1.6
Erstellen Sie eine JSON-API, die die RSA-Verschlüsselung mit Wicket unterstützt
Ich habe einen API-Client für Nature Remo erstellt
Holen Sie sich den Body-Teil von HttpResponse mit Spring Filter
Ich habe versucht, JavaFX und Spring Framework zu verknüpfen.
Holen Sie sich Daten mit der API, die mit dem Befehl curl erstellt wurde
Ich wollte Spring Boot in einem Multiprojekt gradle
◆ Rufen Sie die von Spring Boot erstellte API von React ab
Erstellen Sie einen Web-API-Server mit Spring Boot
Behandeln Sie JSON domänenübergreifend mit Play Framework