HttpServletRequest içindeki getRequestURI ve getPathInfo yöntemleri arasındaki fark nedir?


143

Basit, çok hafif bir ön kontrolör yapıyorum. Doğru olanı seçmek için istek yollarını farklı işleyicilere (eylemler) eşleştirmem gerekiyor.

Benim yerel makinede HttpServletRequest.getPathInfo()ve HttpServletRequest.getRequestURI()aynı sonuçları döndürür. Ama üretim ortamında neye geri döneceklerinden emin değilim.

Peki, bu yöntem arasındaki fark nedir ve ne seçmeliyim?


1
Bu yanıtı da yararlı bulabilirsiniz .
BalusC

@BalusC: teşekkürler, bu cevaptan bazı ipuçları zaten kullanıyorum.
Roman

Bu farkı güzel bir diyagramla açıklıyor: agiletribe.wordpress.com/2016/02/23/…
AgilePro

Yanıtlar:


77

getPathInfo()URI'den sonra, Servlet'inize erişmek için kullanılan ek yol bilgilerini getRequestURI()verir; burada , tam URI'yi verir.

Bir Servlet'in kendi URI deseni ile yapılandırılması gerektiğinde, farklı olacağını düşünürdüm; Ben hiç kök (/) bir Servlet hizmet sanmıyorum.

Örneğin, Servlet 'Foo' URI '/ foo' ile eşlenmişse URI'yi düşünürdüm:

/foo/path/to/resource

Şunlarla sonuçlanır:

RequestURI = /foo/path/to/resource

ve

PathInfo = /path/to/resource

20
kod çözme davranışından bahsetmeye değer. getRequestURI () dizginin kodunu çözmez. GetPathInfo () kodu çözülür.
Kavindu Dodanduwa

1
Bazı durumlarda getRequestURI()dizeyi "/foo/path/to/resource"beklendiği gibi verir , ama getPathInfo()aynı HttpServletRequestnesne için bana verir null. Dünyada neler oluyor? EDIT: Aşağıda "30thh" kullanıcısı tarafından cevaplanır.
anddero

460

Burada küçük bir karşılaştırma tablosu koyacağım (sadece bir yere sahip olmak için):

Sunucu /test%3F/*uygulaması olarak eşlenir ve uygulama altına dağıtılır /app.

http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a

Method              URL-Decoded Result           
----------------------------------------------------
getContextPath()        no      /app
getLocalAddr()                  127.0.0.1
getLocalName()                  30thh.loc
getLocalPort()                  8480
getMethod()                     GET
getPathInfo()           yes     /a?+b
getProtocol()                   HTTP/1.1
getQueryString()        no      p+1=c+d&p+2=e+f
getRequestedSessionId() no      S%3F+ID
getRequestURI()         no      /app/test%3F/a%3F+b;jsessionid=S+ID
getRequestURL()         no      http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S+ID
getScheme()                     http
getServerName()                 30thh.loc
getServerPort()                 8480
getServletPath()        yes     /test?
getParameterNames()     yes     [p 2, p 1]
getParameter("p 1")     yes     c d

Yukarıdaki örnekte, sunucu üzerinde çalışmakta localhost:8480ve ad 30thh.locOS hostsdosyasına konulmuştur .

Yorumlar

  • "+" yalnızca sorgu dizesinde boşluk olarak işlenir

  • "#A" bağlantısı sunucuya aktarılmıyor. Sadece tarayıcı onunla çalışabilir.

  • Eğer url-patternservlet haritalama içinde bitmez *(örneğin /testya *.jsp,) getPathInfo()getiriler null.

Spring MVC kullanılıyorsa

  • Yöntem getPathInfo()geri döner null.

  • Yöntem getServletPath(), bağlam yolu ile oturum kimliği arasındaki bölümü döndürür. Yukarıdaki örnekte değer/test?/a?+b

  • İlkbahar @RequestMappingve @RequestParamBahar aylarında URL kodlu bölümlere dikkat edin . Buggy (mevcut sürüm 3.2.4) ve genellikle beklendiği gibi çalışmıyor .


20
Cevabınızı yazdırıyorum ve ofisimize poster olarak koyuyorum. Bu ne kadar faydalı!
Ibrahim Arief

2
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.parlak.
Boris Treukhov

1
Her ikisine de inanıyorum getRequestURI()ve getRequestURL()bu durumda çözülmeyen jsessionid'i döndürmeliyim S%3F+ID. En azından Tomcat / 8.5.6'da.
Gediminas Rimsa

30

Bir istemcinin sunucu uygulamanıza ulaşmak için adres çubuğuna yazacağı tam URL'yi parçalayalım:

http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo

Parçalar:

  1. şeması: http
  2. hostname: www.example.com
  3. Liman: 80
  4. bağlam yolu: awesome-application
  5. sunucu uygulaması yolu: path/to/servlet
  6. yol bilgisi: path/info
  7. sorgu: a=1&b=2
  8. fragmanı: boo

İstek URI'si ( getRequestURI tarafından döndürülür ) bölüm 4, 5 ve 6'ya karşılık gelir.

(bu arada, bunu istemeseniz bile , getRequestURL yöntemi size bölüm 1, 2, 3, 4, 5 ve 6'yı verir).

Şimdi:

  • bölüm 4 (bağlam yolu), sunucunuzda çalışıyor olabilecek diğer birçok uygulamadan özel uygulamanızı seçmek için kullanılır
  • bölüm 5 (sunucu uygulaması yolu), uygulamanızın WAR'sında paketlenmiş olabilecek diğer birçok sunucu uygulamasından belirli bir sunucu uygulamasını seçmek için kullanılır
  • bölüm 6 (yol bilgisi) sunucu uygulamanızın mantığı tarafından yorumlanır (örneğin sunucu uygulamanız tarafından kontrol edilen bir kaynağa işaret edebilir).
  • bölüm 7 (sorgu) getQueryString kullanarak sunucu uygulamanız için de kullanılabilir
  • bölüm 8 (parça) sunucuya gönderilmez ve yalnızca istemciyle ilgilidir ve bilinir

Aşağıdakiler her zaman geçerlidir (URL kodlama farklılıkları hariç):

requestURI = contextPath + servletPath + pathInfo

Servlet 3.0 belirtiminden aşağıdaki örnek çok yararlıdır:


Not: resim, HTML'de yeniden oluşturmak için zamanım yok:

resim açıklamasını buraya girin


16

Aşağıdaki sunucu uygulamasına dikkat edin:

   <servlet>
        <servlet-name>NewServlet</servlet-name>
        <servlet-class>NewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>NewServlet</servlet-name>
        <url-pattern>/NewServlet/*</url-pattern>
    </servlet-mapping>

Ben URL'yi vurduğunda Şimdi http://localhost:8084/JSPTemp1/NewServlet/jhi, bu çağıracağı NewServletdesen yukarıda açıklanan ile eşlenen gibi.

Buraya:

getRequestURI() =  /JSPTemp1/NewServlet/jhi
getPathInfo() = /jhi

Bunlara sahibiz:

  • getPathInfo()


    sunucu uygulaması yolundan sonra ancak istek URL'sindeki sorgu dizesinden önce gelen ek yol bilgilerini belirterek web kapsayıcı tarafından kodu çözülen bir Dize döndürür ; veya URL'de fazladan yol bilgisi yoksa null

  • getRequestURI()


    protokol adından sorgu dizesine kadar URL'nin bir kısmını içeren bir Dize döndürür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.