【问题标题】:How to properly map Servlet?如何正确映射 Servlet?
【发布时间】:2015-01-23 11:56:40
【问题描述】:

我想正确映射我的 servlet 1)我希望它应该在 url 类似于“show.jsp/anything”,即当用户输入“show.jsp/”+由“字母和数字”但不是“符号”组成的任何字符串时,即用户输入时 "show.jsp/1232342$3=4" 它应该抛出一个错误 我的映射

<servlet>
        <servlet-name>show</servlet-name>
        <jsp-file>/show.jsp</jsp-file>
 </servlet>
<servlet-mapping>
        <servlet-name>show</servlet-name>
         <url-pattern>/show.jsp/*</url-pattern>
</servlet-mapping>

当用户进入 "show.jsp/asd%&hdfsjf" 它应该转到另一个 url 即我应该写什么来代替

<url-pattern>/show.jsp/*</url-pattern>

【问题讨论】:

    标签: jsp servlets web.xml


    【解决方案1】:

    这可能不是预期的答案,但您必须使用 Java EE 提供的功能。 Servlet 3.0 规范说:

    在 Web 应用程序部署描述符中,使用以下语法来定义映射:

    • / 字符开头并以/* 后缀结尾的字符串用于路径映射。
    • *. 前缀开头的字符串用作扩展映射。
    • 空字符串 ("") 是一种特殊的 URL 模式,它完全映射到 应用程序的上下文根,即http://host:port// 形式的请求。在这种情况下,路径信息为 /,而 servlet 路径和上下文路径为空字符串 ("")。
    • 仅包含/ 字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet 路径是请求 URI 减去上下文路径,并且路径信息为空。
    • 所有其他字符串仅用于完全匹配。

    这意味着你不能做你想做的事,除了你可以使用容器将使用的事实:

    • 首先是完全匹配
    • 下一个最长的匹配项

    例如,如果您想将/show.jsp/asd 映射到一个servlet 并将/show.jsp/* 映射到另一个,这是可能的。但是没有办法区分字符的类型。

    它与您想要的不匹配,但它是它的工作方式......


    如果你真的想这样做,你将不得不开发一个映射到`/show.jsp/*' 的中继servlet。它将分析 PathInfo 字符串并转发到其他(未映射的)servlet 之一,具体取决于它是否包含非字母字符。

    在 web.xml 中:

    <servlet>
            <servlet-name>relay</servlet-name>
            <servlet-class>distinguished.classof.Relay</servlet-class>
     </servlet>
    <servlet>
            <servlet-name>show</servlet-name>
            <jsp-file>/show.jsp</jsp-file>
     </servlet>
    <servlet>
            <servlet-name>other</servlet-name>
            <jsp-file>/other.jsp</jsp-file>
     </servlet>
    <servlet-mapping>
            <servlet-name>relay</servlet-name>
             <url-pattern>/show.jsp/*</url-pattern>
    </servlet-mapping>
    

    中继:

    public class Relay extends HttpServlet {
        static final String SHOW = "show";
        static final String OTHER= "other";
        private Pattern pattern;
    
    
        @Override
        protected void service(HttpServletRequest hsr, HttpServletResponse hsr1) throws ServletException, IOException {
            String info= hsr.getPathInfo();
            RequestDispatcher dispatcher = getServletContext.getNamedDispatcher(
                    pattern.matcher(info).matches() ? SHOW : OTHER);
            dispatcher.forward(hsr, hsr1);
        }
    
        @Override
        public void init() throws ServletException {
            pattern = Pattern.compile("\\w*");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-14
      • 1970-01-01
      • 2017-02-05
      • 2015-02-07
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 2011-11-01
      相关资源
      最近更新 更多