如何仅为某些扩展限制Servlet映射

时间:2014-05-26 15:51:45

标签: java jsp java-ee servlets

我想将Cutome servlet仅用于没有.jsp,jss,css和图片扩展等扩展名的网址。

我试过这样但没用。

Web.xml:

<filter>
    <filter-name>ControllerFilter</filter-name>
    <filter-class>tut.controller.ControllerFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ControllerFilter</filter-name>
    <servlet-name>ControllerServlet</servlet-name>
</filter-mapping>

<servlet>
    <servlet-name>ControllerServlet</servlet-name>
    <servlet-class>tut.controller.ControllerServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ControllerServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

    <servlet>
    <servlet-name>FileServlet</servlet-name>
    <servlet-class>tut.controller.FileServlet</servlet-class>
</servlet>

过滤:

String requestedUri = ((HttpServletRequest)request).getRequestURI();
System.out.println("requestedUri:"+requestedUri);
if(requestedUri.matches(".*[css|jpg|png|gif|js|jsp]*")){
           //How to configure the default calling here
       return;
}
else 
{
  // ControllerServlet  for other requests
  chain.doFilter(request, response);
}

2 个答案:

答案 0 :(得分:1)

尝试使用$表示正则表达式中的一行结尾

requestedUri.matches(".*[css|jpg|png|gif|js|jsp]$")

如果匹配,则遵循链,否则将请求转发到所需的Servlet,JSP或HTML。

if (uri.matches(".*[css|jpg|png|gif|js|jsp]$")) {
    filterChain.doFilter(req, res);
}else{
    // forward the request to Servlet/JSP/HTML
    req.getRequestDispatcher("path").forward(req, resp);
}

的web.xml:

使用/作为过滤器的url模式来检查所有请求,然后根据uri将它转发到过滤器本身的Servlet / JSP / HTML。

<filter-mapping>
    <filter-name>ControllerFilter</filter-name>
    <servlet-name>/</servlet-name>
</filter-mapping>

在此处找到更好的解决方案Servlet for serving static content

答案 1 :(得分:0)

我认为Filter不是一个实现你想要的好机制。如果Filter收到了不需要的扩展请求,那么处理此问题为时已晚。

您可以在Filter中修改您的请求和响应,以进行预处理或后处理,但这可能不是您正在寻找的。您希望这些扩展不会被路由到servlet ,而是由静态内容处理程序处理。

要执行您想要的操作,您需要将静态内容放在一个不在可以匹配Servlet路径的路径下的文件夹中,否则您的servlet将获得静态内容的请求,此时您需要对你的servlet中的内部请求做些什么。