[英]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.