Servlet 3.0 HttpServletRequest#login()认证后,重定向到受保护资源或原始/保存请求?

Gra*_*eld 4 java authentication servlet-3.0 jsf-2 glassfish-3

正如所料,登录页面在请求受保护/安全资源时加载:

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>jdbc</realm-name>
    <form-login-config>
        <form-login-page>/login.xhtml</form-login-page>
        <form-error-page>/login.xhtml</form-error-page>
    </form-login-config>
</login-config>
Run Code Online (Sandbox Code Playgroud)

我知道j_security_check如果身份验证成功,它将自动转发到受保护/安全资源:

<form method="post" action="j_security_check">
    <input type="text" name="j_username">
    <input type="password" name= "j_password">
</form>
Run Code Online (Sandbox Code Playgroud)

不过,我想允许用户注册(或登录)继续这样我用JSF 2.0: <h:form...,EL: #{loginBean.register()}...等...而我从Servlet 3.0编程验证:

public void register() {
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

    try {
        // Register...

        request.login(this.username, this.password);

        // Redirect to the protected/secure resource...

    } catch (ServletException e) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如何找出最初请求的资源是什么?可能是:

  • 从会话中获取"已保存的请求" (特定容器)
  • 尝试以某种方式访问​​"原始请求" (在哪里)
  • 任何与请求调度程序相关的内容(疯狂猜测)
  • 使用"referer"标题(坏主意)
  • 创建服务器身份验证模块(SAM)(不简单)

任何建议将非常感谢!

Bal*_*usC 5

登录页面位于由转发打开的封面下,原始请求URI可用作具有名称的请求属性javax.servlet.forward.request_uri.

所以:

String uri = request.getAttribute("javax.servlet.forward.request_uri");
Run Code Online (Sandbox Code Playgroud)

或者,更多JSF-ish:

String uri = externalContext.getRequestMap().get("javax.servlet.forward.request_uri");
Run Code Online (Sandbox Code Playgroud)