支持两个具有相同servlet的URI

时间:2012-01-12 22:28:38

标签: java web-services http servlets web

目前,我们将网站上的所有链接设置为/xxx/UseCase

我们希望现在接受前缀/yyy的传入请求,例如/yyy/xxx/UseCase。因此,我们将有一个servlet接受/yyy/xxx/UseCase/xxx/UseCase上的请求。

我们怎么做?

这里面临的最大挑战是:许多页面使用绝对路径重定向到其他URI。即:Patients servlet重定向到/xxx/Insurance。问题是,如果您在/yyy/xxx/Patients,现在不应该重定向到/xxx/Insurance - 您应该被重定向到/yyy/xxx/Insurance

2 个答案:

答案 0 :(得分:4)

您可以在多个URL模式上映射servlet:

<servlet-mapping>
    <servlet-name>fooServlet</servlet-name>
    <url-pattern>/xxx/*</url-pattern>
    <url-pattern>/yyy/*</url-pattern>
</servlet-mapping>

或者当你已经使用Servlet 3.0时:

@WebServlet(urlPatterns={"/xxx/*", "/yyy/*"})
public class FooServlet extends HttpServlet {
    // ...
}

如有必要,您可以使用/yyy/xxx/*代替/yyy/*

或者,如果您打算解开servlet映射,您还可以创建Filter,将/yyy/xxx/*上的请求转发给/xxx/*。这样的事情(省略基本检查):

@WebFilter("/yyy/xxx/*")
public class FooFilter implements Filter {

    // ...

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest req = (HttpServletRequest) request;
        String oldURI = req.getRequestURI().substring(req.getContextPath().length() + 1);
        String newURI = oldURI.substring(oldURI.indexOf("/"));
        req.getRequestDispatcher(newURI).forward(request, response);
    }

    // ...
}

如果您打算将浏览器地址栏中的网址从/yyy/xxx/*更改为/xxx/*,则需要使用HttpServletResponse#sendRedirect()代替RequestDispatcher#forward()

         // ...
         HttpServletResponse res = (HttpServletResponse) response;
         res.sendRedirect(newURI);

答案 1 :(得分:1)

我认为问题不在于你的servlet映射。我认为这与你如何进行重定向有关。试试这个重定向逻辑......

response.sendRedirect(request.getRequestURI().replace("Patients", "Insurance"));

这样你就不必弄乱if语句,因为它应该适用于两种情况。