gpt4 book ai didi

java - 支持具有相同 servlet 的两个 URI

转载 作者:行者123 更新时间:2023-12-01 17:33:17 25 4
gpt4 key购买 nike

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

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

我们怎样才能做到这一点?

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

最佳答案

您可以将 Servlet 映射到多个 URL 模式:

<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);
}

// ...
}

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

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

关于java - 支持具有相同 servlet 的两个 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com