当前位置: 首页 > 面试题库 >

JSF 2.0:使用HttpServletRequest.login后如何重定向到受保护的页面

司空和悌
2023-03-14
问题内容

我正在尝试将HttpServletRequest.login与基于表单的身份验证一起使用。

一切正常(容器会告诉您登录名/密码是否正确),除了在用户输入登录名之后,我不知道如何将用户重定向到他要求的受保护页面(重新显示登录表单)。怎么做?

在此先感谢您的帮助。

代码:

web.xml:

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>security</realm-name>
    <form-login-config>
        <form-login-page>/faces/loginwithlogin.xhtml</form-login-page>
        <form-error-page>/faces/noaut.xhtml</form-error-page>
    </form-login-config>
</login-config>

页面loginwithlogin.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Authentication</title>
    </h:head>
    <h:body>
        <h:form>
            Login :
            <h:inputText value="#{login.login}" required="true" />
            <p/>
            Mot de passe :
            <h:inputSecret value="#{login.password}" required="true" />
            <p/>
            <h:commandButton value="Connexion" action="#{login.submit}">
                 <f:ajax execute="@form" render="@form" />
            </h:commandButton>
            <h:messages />
        </h:form>
    </h:body>
</html>

更新:没有Ajax,它将不起作用。

后备豆:

@Named
@SessionScoped
public class Login implements Serializable {
  private String login;
  private String password;
  // getters and setters 
  ...

  public void submit() {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = 
            (HttpServletRequest) context.getExternalContext().getRequest();
    try {
        request.login(login, mdp);
        context.addMessage(null, 
                new FacesMessage(FacesMessage.SEVERITY_INFO, 
                "OK", null));
    } catch (ServletException e) {
        context.addMessage(null, 
                new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                "Bad login", null));
    }
  }

}

问题答案:

对于基于容器管理的表单的身份验证,登录页面位于由a打开的掩盖下,RequestDispatcher#forward()因此原始请求URI可作为请求属性使用,其名称由标识RequestDispatcher#FORWARD_REQUEST_URI。请求属性(基本上是请求范围)在JSF中,由提供ExternalContext#getRequestMap()

因此,这应该做到:

private String requestedURI;

@PostConstruct
public void init() {
    requestedURI = FacesContext.getCurrentInstance().getExternalContext()
        .getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);

    if (requestedURI == null) {
        requestedURI = "some/default/home.xhtml";
    }
}

public void submit() throws IOException {
    // ...

    try {
        request.login(username, password);
        externalContext.redirect(requestedURI);
    } catch (ServletException e) {
        context.addMessage(null, 
                new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                "Bad login", null));
    }
}

你只需要做出豆@ViewScoped(JSF)或@ConversationScoped代替(CDI)
@SessionScoped(绝对不是@RequestScoped;与其一起使用,否则不同的方法的需求<f:param><f:viewParam>)。



 类似资料:
  • 默认情况下,身份验证后的Spring Security会将您重定向到您之前尝试访问的受保护页面。 当我实现自己的成功处理器时 我不能达到同样的效果。我试图重定向到referer,但在本例中,referer是/en/login页面。 基本上: 用户尝试访问受保护的url 将用户重定向到页面 验证后,用户应再次重定向到 如何使用custom successHandler实现这一点?

  • 我正在努力使一个向上投票和向下投票的功能在我的网站。然而,有一个我不喜欢的特殊行为,那就是每当用户点击按钮时,他不应该被重定向到另一个页面,而应该保持在同一页面上。 点击upvote按钮后,会转到url,这是我不想要的。我希望它保持在同一页面上,即 models.py views.py urls.py 查看-supplier.html

  • 我正在学习Spring Boot。我有一个具有唯一id的产品列表,我想实现“按id查找”功能,但我不知道如何做到,我搜索了但得到了完全不同的东西。 我已经有一个这样的@Get映射方法: 如果我在url中手动输入id,我会得到我想要的东西。但我想在HTML页面中有一个输入框,如: 在我提交表单后,它将重定向到该页面。例如,如果输入1,它将转到localhost:8080/products/1 我一直

  • 问题内容: 关键字授予对相同包和子类(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)中的类的访问权限。 现在,每个类都有一个超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html)。 因此,我得出结论,即使每个类都可以访问的方法。

  • 问题内容: 我正在使用ajax调用在服务文件中执行功能,并且如果响应成功,我想将页面重定向到另一个URL。目前,我正在通过使用简单的js“ window.location = response[‘message’];”来做到这一点。但是我需要用angularjs代码替换它。我看过关于的各种解决方案,他们使用了$location。但是我是新手,对实现它有困难。 问题答案: 您可以使用Angular

  • 我有一个两步验证表单,这意味着第一个用户输入得到验证(在ValidatecKetData控制器中),如果一切正常,您可以进入下一个表单页面,我可以通过 问题:在第二页,用户需要上传一个文件,如果他不这样做,验证失败。 如果是这种情况,验证器类立即重定向,因为它是后路由,所以不起作用。 所以我创建了一个这样的获取路线: 并将其放入-方法: 我把它放到了-method中,因为如果用户不在第二页附加文件