如何使用servlet过滤器来更改传入的servlet请求URL
http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123
至
http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123
?
更新:根据BalusC的以下步骤,我想出了以下代码:
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() {
//
}
}
Run Code Online (Sandbox Code Playgroud)
相关条目web.xml如下所示: …
我的文件WebContent/jsps夹中的JSP文件中有一个HTML表单.我servlet.java在src文件夹中的默认包中有一个servlet类.在我web.xml的映射为/servlet.
我action在HTML表单的属性中尝试了几个URL :
<form action="/servlet">
Run Code Online (Sandbox Code Playgroud)
<form action="/servlet.java">
Run Code Online (Sandbox Code Playgroud)
<form action="/src/servlet.java">
Run Code Online (Sandbox Code Playgroud)
<form action="../servlet.java">
Run Code Online (Sandbox Code Playgroud)
但这些都不起作用.他们都在Tomcat 6/7/8中继续返回如下所示的HTTP 404错误:
HTTP状态404 - /servlet
描述:请求的资源(/ servlet)不可用.
或者如下面的Tomcat 8.5/9:
HTTP状态404 - 未找到
消息:/ servlet
描述:源服务器没有找到目标资源的当前表示,或者不愿意透露存在该资源
为什么不起作用?
是否可以将URL映射到servlet(可能是Tomcat特有的),以便后面的两个URL({id}是从代码中检索的变量),
/users/{id}/a
/users/{id}/b
Run Code Online (Sandbox Code Playgroud)
映射到两个不同的servlet,或者我是否必须为映射到的servlet实现我自己的某种过滤器/users/*?
更清楚的是,具有该模式的任何URL /users/*/a都应映射到同一个servlet.同样的道理/users/*/b.
有一个@WebServlet(urlPatterns = "/myServlet/").如果用户去myapp/myServlet/other,我仍然希望我的servlet能够捕获.所以说,在servlet路径之后的通配符.我怎么能这样做?