首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Tomcat的<servlet-mapping> <url-pattern>中指定查询字符串?

如何在Tomcat的<servlet-mapping> <url-pattern>中指定查询字符串?
EN

Stack Overflow用户
提问于 2012-03-27 05:43:04
回答 3查看 4.2K关注 0票数 3

我正在运行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)不可用。

我尝试了许多变体(引用字符串,...)在上面的URL模式上,我总是得到上面的错误。我注意到如果我(出于调试目的)去掉了"?“与在<url-pattern>/goP=123</url-pattern>中一样,我不再收到错误消息,服务器启动(当然,它不会响应“查询字符串”,因为它的格式不正确)。这向我暗示了"?“导致了映射中的问题。我尝试用它的URL特殊字符替换它,如下所示:<url-pattern>/go%3FP=123</url-pattern>,但是当我尝试删除"?“时,结果与上面描述的相同。总而言之。

我意识到,我可以让servlet在提交任何查询字符串时启动,然后“忽略”除了我关心的请求之外的所有请求,但我不希望启动servlet是有原因的。因此,我的问题是,如何配置servlet,使其仅在包含特定查询字符串时启动?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-27 18:45:57

您不能使用URL模式来做到这一点。

您可以使用过滤器来实现这一点。实现一个过滤器,只有当查询参数存在时,它才会转发到Servlet。

这里是过滤器的外观:

代码语言:javascript
复制
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 中定义过滤器,如下所示:

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2012-03-27 05:45:02

你不能这么做。url-pattern是相当有限的。

如果您希望根据GET参数执行不同的操作,则可以手动执行。在servlet的doGet()方法中,有一个简单的if-clause,并根据查询字符串/ get参数调用不同的方法。

票数 3
EN

Stack Overflow用户

发布于 2012-03-27 17:51:47

要添加到Bozho response,您也可以尝试移动到Clean URLs

这将极大地增加您在URL模式匹配方面的选择,尤其是,如果您需要一个前端反向代理,它可能会大大简化配置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9880295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档