簡體   English   中英

Servlet容器,Servlet URL模式和請求包裝器

[英]The servlet container, the servlet url pattern and request wrappers

我正在做一個項目,其中基於Web應用程序的請求URL中是否存在特定字符串,我試圖使用請求包裝程序修改請求的URL。

我了解到,即使我在包裝器中重寫getRequestURI,getRequestURL和getServletPath方法並從過濾器發送該包裝器,servlet容器仍然使用其自己的ServletRequest接口實現來確定要調用的servlet。

我相信容器在ServletRequest的實現類中將存儲的變量用於請求URI,並且實際上並未調用任何getRequestURI,getRequestURL和getServletPath方法來標識要使用的Servlet(匹配URL模式)。

需要您的所有投入和知識,以了解有關此主題的更多信息。 請幫助我更好地學習此主題。 謝謝..!!

下面是我的實驗代碼,該請求來自http:// localhost:8080 / RequestResponseListenersWebApp / pages / abcd.jsp的jsp

過濾器

@WebFilter(filterName = "AllRequestScanFilter", urlPatterns = "/*")
public class AllRequestScanFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;

        EmployerViewTestBusinessWrapper wrapper = new EmployerViewTestBusinessWrapper(request);

        if (request.getRequestURI().contains("abcd.jsp"))
            chain.doFilter(wrapper, resp);
        else {
            chain.doFilter(req, resp);
        }
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

包裝器

public class EmployerViewTestBusinessWrapper extends HttpServletRequestWrapper {

    public EmployerViewTestBusinessWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getPathTranslated() {
        return super.getPathTranslated();
    }

    @Override
    public String getRequestURI() {
        String currentPath=pathModified(super.getRequestURI());
        return currentPath!=null?currentPath:super.getRequestURI();
    }

    @Override
    public StringBuffer getRequestURL() {
        String currentPath=pathModified(super.getRequestURL().toString());
        return currentPath!=null?new StringBuffer(currentPath):new StringBuffer(super.getRequestURL());
    }

    @Override
    public String getServletPath() {
        String currentPath=pathModified(super.getServletPath());
        return currentPath!=null?currentPath:super.getServletPath();
    }

    private String pathModified(String currentPath){
        String returnPath=null;
        if(currentPath.contains("pages")){
            returnPath=currentPath.replaceFirst("/pages/","/pages/myapp/");
        }

        return returnPath;
    }
}

從未達到的Servlet

@WebServlet(name = "EmployerViewTestServlet",urlPatterns = "/pages/myapp/*")
public class EmployerViewTestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String path=request.getParameter("path");
    }
}

還有一件事。 我在這里指定的過濾器是Web應用程序在請求進入時首先調用的內容。

我總是可以檢查過濾器中的URL模式,並使用RequestDispatcher將請求轉發到所需的URL模式。

但是,在我的應用程序中,有一些針對調度程序類型FORWARD的篩選器,我不希望在客戶端剛發出請求時調用它們。

不是您要的東西嗎?

在這種情況下, request.getRequestDispatcher(newURI).forward(req, res)似乎可以解決問題,僅使用過濾器即可。

@WebFilter(filterName = "AllRequestScanFilter", urlPatterns = "/*")
public class AllRequestScanFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;

        //EmployerViewTestBusinessWrapper wrapper = new EmployerViewTestBusinessWrapper(request);

        String URI = request.getRequestURI();

        if (URI.contains("abcd.jsp") && URI.contains("pages")) {
            URI = URI.replaceFirst("/pages/","/pages/myapp/");
            request.getRequestDispatcher(URI).forward(req, res);
        } else {
            chain.doFilter(req, resp);
        }
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM