目前,我们将网站上的所有链接设置为/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
答案 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语句,因为它应该适用于两种情况。