Ich habe eine API-Domain mit Spring Framework erstellt. Teil 1
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>
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)
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
api. Beim Zugriff auf localhost
Die Subdomain ermöglichte uns den Zugriff. ヾ (.> ﹏ <.) Nr Sie müssen lediglich die Funktion schreiben, die Sie schreiben möchten
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