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.