Gelen sunucu uygulaması istek URL'sini değiştirmek için Java'da sunucu uygulaması filtresi nasıl kullanılır?


186

Gelen sunucu uygulaması istek URL'sini değiştirmek için sunucu uygulaması filtresini nasıl kullanabilirim?

http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123

için

http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123

?


Güncelleme : BalusC'nin aşağıdaki adımlarına göre, aşağıdaki kodu buldum:

public class UrlRewriteFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {
        //
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        String requestURI = request.getRequestURI();

        if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
            String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
            String newURI = requestURI.replace(toReplace, "?Contact_Id=");
            req.getRequestDispatcher(newURI).forward(req, res);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
        //
    }
}

İlgili giriş web.xmlşuna benzer:

<filter>
    <filter-name>urlRewriteFilter</filter-name>
    <filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>urlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Beklenen sonuçlarla hem sunucu tarafı hem de istemci tarafı yönlendirmesini denedim. İşe yaradı, teşekkürler BalusC!



Sunucu uygulaması spesifikasyonunun hangi sürümünü kullanıyorsunuz? İstekleri nasıl ilettiğiniz farklı sürümlerle değişir.
Romain Hippeau


Orijinal URL'niz nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123 ? ** param1 = A & param2 = B ** parametreleri içeriyorsa, bu parametrelerin bir sonraki sunucu uygulamasına / jsp'ye de iletileceğini lütfen unutmayın . Kurtulmak veya orijinal parametreleri değiştirmek için bir yol bulamadım (sadece HttpServletRequestWrapper kullanarak). Herhangi bir fikir? .. Güncelleme: Görünüşe göre http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ bu sorunu ele alıyor.
Lopotun

Teşekkürler url yeniden yazma ve şifreleme üzerine bir örnek arıyordum.
Aditya Yada

Yanıtlar:


281
  1. Uygulayın javax.servlet.Filter.
  2. İn doFilter()yöntemi, gelen döküm ServletRequestTo HttpServletRequest.
  3. HttpServletRequest#getRequestURI()Yolu yakalamak için kullanın .
  4. Basit kullanın java.lang.Stringgibi yöntemler substring(), split(), concat()ilgi parçası özü ve yeni bir yol oluşturmak için vb.
  5. Kullanım ya ServletRequest#getRequestDispatcher()ve daha sonra RequestDispatcher#forward()yeni bir URL (tarayıcınızın adres çubuğuna yansıtılmayan sunucu tarafı yönlendirme,) istek / yanıt iletmek için veya dökme gelen ServletResponseetmek HttpServletResponseve daha sonra HttpServletResponse#sendRedirect()yansıyan yeni URL'ye yanıt (istemci taraflı yönlendirme, yönlendirme tarayıcı adres çubuğu).
  6. Filtreyi Kayıt web.xml, bir de url-patternbir /*ya da /Check_License/*bağlam yolu bağlı veya zaten Servlet 3.0 iseniz, kullanmak @WebFilteryerine ilişkin ek açıklama.

URL'nin değiştirilmesi gerekiyorsa kodda bir kontrol eklemeyi unutmayın ve eğer değilse , sadece arayın FilterChain#doFilter(), aksi takdirde kendisini sonsuz bir döngüde çağıracaktır.

Alternatif olarak, Tuckey'nin UrlRewriteFilter gibi Apache'nin yaptığı gibi yapılandırılabilen tüm işleri yapmak için mevcut bir 3. taraf API'sını da kullanabilirsiniz mod_rewrite.


1
Yukarıdaki herhangi bir yerde herhangi bir doFilter () örnek kodu? Teşekkürler.
Frank

20
Tam olarak hangi adımda sıkışıyorsunuz? Cevabım neredeyse kodun kendisini yazıyor. Mavi kod referanslarının aslında sınıf / yöntem davranışını ayrıntılı olarak açıklayan Javadoc'lara bağlantılar olduğunu da not ettiniz mi? Herhangi bir şekilde, burada ve burada iyi JSP / Servlet öğreticileri, özellikle bu filtreler hakkında bulabilirsiniz.
BalusC

1
Doğru olduğunu düşünüyorum, ancak filtre zincirdeki ilklerden biri ve RequestDispatcher#forward()yürütülürse, geri kalan filtreler yürütülmez. Peki, bunu bir sunucu uygulaması olarak yapmanın daha iyi bir yolu olmayacak mı?
lucasvc

2
@datakey: sıralamayı yeniden düzenleyin veya <dispatcher>FORWARD</dispatcher>filtre eşlemesine ekleyin .
BalusC

1
@ JimJim2000: sadece siparişi yeniden düzenleyin veya <dispatcher>FORWARD</dispatcher>filtre eşlemesine ekleyin .
BalusC


7

BalusC'nin cevabının adımlarına dayanan basit bir JSF Url Prettyfier filtresi . Filtre, / ui yolundan başlayarak (orada tüm xhtml dosyalarınızı sakladığınızı varsayarak) tüm istekleri aynı yola iletir, ancak xhtml sonekini ekler.

public class UrlPrettyfierFilter implements Filter {

    private static final String JSF_VIEW_ROOT_PATH = "/ui";

    private static final String JSF_VIEW_SUFFIX = ".xhtml";

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
        String requestURI = httpServletRequest.getRequestURI();
        //Only process the paths starting with /ui, so as other requests get unprocessed. 
        //You can register the filter itself for /ui/* only, too
        if (requestURI.startsWith(JSF_VIEW_ROOT_PATH) 
                && !requestURI.contains(JSF_VIEW_SUFFIX)) {
            request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
                .forward(request,response);
        } else {
            chain.doFilter(httpServletRequest, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}
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.