从 HttpServletRequest 得到美化 URL

Get beautified URL from HttpServletRequest

我正在使用 org.omnifaces.filter.HttpFilter 在没有人登录时在登录页面上重定向访问者。

@Override
public void doFilter(HttpServletRequest req, HttpServletResponse res, HttpSession session, FilterChain chain) throws ServletException, IOException {
    String loginUrl = "/myapp/login?redirect_url=" + req.getRequestURL();
    boolean loggedIn = (req.getRemoteUser() != null);
    if (loggedIn) {
        chain.doFilter(req, res); // So, just continue request.
    } else {
        Servlets.facesRedirect(req, res, loginUrl);
    }
}  

我想将未登录用户重定向到/login?redirect_url=previous_page_url

问题是我所有的 URL 都被 漂亮的面孔 美化了,当我尝试用 [=14 获得以前的 URL =], 它给我丑陋的 URL.

比如我配置了一个url /myapp/my-page-3 显示/views/module1/page3.xhtml.

但是 HttpServletRequest.getRequestURI() 给了我 /views/module1/page3.xhtml 没有 /myapp/my-page-3.

有什么想法吗?

当基于 servlet 的 URL 重写引擎在幕后使用 RequestDispatcher#forward() 将传入的友好 URL 请求转发到所需资源时,您可以使用 request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI) 找出原始请求URI。

String originalRequestURI = request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);

由于您已经在使用 OmniFaces,您可以使用 Servlets#getRequestURI() 自动检测它并 return 它存在时,否则回退到默认值 HttpServletRequest#getRequestURI()

String requestURI = Servlets.getRequestURI(request);