我正在运行Tomcat 5.5.4并且运行没有问题的servlet。但是,我想设置一个映射,以便在提交包含特定查询字符串的URL时启动servlet。
现在在web.xml中我有:
<servlet-mapping>
<servlet-name>MyServer</servlet-name>
<url-pattern>/go/*</url-pattern>
</servlet-mapping>
如果浏览器提交http://localhost/MyServer/go?P=123,则启动servlet并且一切正常。但是,如果URL完全如图所示,我只想启动该servlet。不幸的是,现在如果URL为http://localhost/MyServer/go?P=AnyDarnThing,则servlet仍会启动。我尝试过设置以下内容:
<url-pattern>/go?P=123</url-pattern>
但这会导致请求的资源(/ MyServer / go)不可用。
我在上面的网址模式上尝试了很多变化(引用字符串,...),但我总是遇到上述错误。我注意到,如果我(出于调试目的)放弃&#34;?&#34;如在
<url-pattern>/goP=123</url-pattern>
我不再收到错误消息并且服务器启动(但是,它当然没有响应&#34;查询字符串&#34;因为它没有正确形成。)这对我来说那&#34;?&#34;导致映射问题。我尝试用它的URL特殊字符替换它,如下所示:
<url-pattern>/go%3FP=123</url-pattern>
但是当我尝试放弃&#34;?&#34;时,这给出了上面描述的相同结果。共
我意识到我可以在提交任何查询字符串时让servlet启动,然后&#34;忽略&#34;除了我关心的那个之外的所有请求,但是我有理由不想开始使用servlet。所以,我的问题是,如何配置servlet以便仅在包含特定查询字符串时启动它?
谢谢。
答案 0 :(得分:3)
你做不到。 url-pattern
非常有限。
如果您希望根据GET参数执行不同的操作,则可以手动执行此操作。在servlet的doGet()
方法中有一个简单的if
- 子句,并根据查询字符串/ get参数调用不同的方法。
答案 1 :(得分:2)
使用网址格式无法做到这一点。
您可以使用过滤器来实现此目的。实现一个过滤器,只有在查询参数存在时才会转发到Servlet。
以下是过滤器的外观:
public class ServletAcessFilter implements Filter
{
public void init(FilterConfig filterConfig) throws ServletException
{
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException
{
//validate the request, check if the request can be forwarded to servlet.
if(request.getParameter("P").equalsIgnoreCase("123")){
filterChain.doFilter(request, response);
} else {
//write what you want to do if the request has no access
//below code will write 404 not found, you can do based on your requirement
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setStatus(404);
}
}
public void destroy()
{
}
}
在web.xml
中定义过滤器,如下所示:
<filter>
<filter-name>ServletAccessFilter</filter-name>
<filter-class>com.ServletAcessFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ServletAccessFilter</filter-name>
<url-pattern>/go/*</url-pattern>
</filter-mapping>
答案 2 :(得分:1)
要添加Bozho回复,您还可以尝试转到Clean URLs
这将极大地增加您在URL模式匹配方面的选择,特别是,如果您需要,可以显着简化前端反向代理的配置。