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

2023-11-25

我正在尝试将 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));
    }
  }

}

在容器管理的基于表单的身份验证的情况下,登录页面位于由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> and <f:viewParam>).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 协助持续进行 Java 到 C# 转换的工具

    如今 许多项目都是用 Java 编写的 其中一些最终转换为 C 以合并到 NET 中 我想到的例子有 log4net nhibernate 和 db4o 包括 Sharpen db4o 的工具 在内 您是否见过和 或使用过任何使连续转换变得
  • 如何从内容处置中读取编码的文件名

    我得到的内容处置标头值如下 附件 文件名 UTF 8 album jpeg 如何从中提取文件名 album jpeg 在查看该值时 它具有编码格式值 使用Spring的内容配置 https docs spring io spring doc
  • 有没有一种独立的JAVA可以在PC上运行而无需任何操作系统

    据我所知 java 程序可以在任何操作系统上运行 任何类型的机器都有 JVM 我需要一个在我的 PC 上独立运行的 JVM 而不是在我的操作系统 Windows 或任何其他操作系统 上运行 我的意思是 JVM 的作用类似于启动 而不是操作系
  • 超立方体错误。非法的最小或最大规格

    尝试从这里运行示例代码http tess4j sourceforge net codesample html http tess4j sourceforge net codesample html我收到一条错误消息 Error Illega
  • while循环内的递归,它是如何工作的?

    你能告诉我这段java代码是如何工作的吗 public class Main public static void main String args Strangemethod 5 public static void Strangemet
  • 将 4 个字节转换为无符号 32 位整数并将其存储在 long 中

    我正在尝试用 Java 读取二进制文件 我需要读取无符号 8 位值 无符号 16 位值和无符号 32 位值的方法 执行此操作的最佳 最快 最美观的代码 是什么 我在 C 中做到了这一点 并做了类似的事情 uint8 t buffer uin
  • Magento 外部登录不会创建会话 cookie

    我正在尝试从外部站点替换 Magento 的相当笨拙的 ajax 登录 该网站使用 Magento 作为商店 站点和 magento 商店都有自己的登录信息 因此当用户登录时 两者同步非常重要 这是通过每次页面重新加载时进行 ajax 调用
  • 在 Postgres 中为特定查询设置 work_mem

    我正在使用一个委托给 JDBC 驱动程序的库PostgreSQL 而且有些查询非常复杂 需要更多内存 我不想设置work mem对于所有查询来说都是大的 只是这个子集 问题是执行以下代码会导致错误 pseudo code for what
  • Java程序验证signtool签名的数字签名

    我已经使用 SignTool 对文件 exe 或 dll 不是 jar 文件 进行了数字签名 Signtool还可以验证数字签名 但我的要求是使用java程序检查由signtool签名的文件的数字签名 我在互联网上搜索但没有找到任何信息 您
  • CXF 客户端异常:{XXX} 的拦截器已引发异常,现在展开

    我遇到以下 CXF 异常 warning Interceptor for http example com wsdl esc 2011 12 12 AmazonEC2 http example com wsdl esc 2011 12 12
  • 通过代理从java发送电子邮件

    我使用 Java Mail API 来发送和接收电子邮件 现在我做这个项目的地方有一个代理服务器 我可以知道如何通过代理服务器从java发送电子邮件吗 请参阅此处的常见问题解答 http www oracle com technetwork
  • Java 将 String[] 转换为 int[]

    我有一个 String 其中每个元素都可以转换为整数 将其转换为 int 的最佳方法是什么 int StringArrayToIntArray String s public static int StringArrToIntArr Str
  • 如何暂停程序直到按下按钮?

    我使用从 jframe 扩展的类 它有一个按钮 我在程序中使用它 我希望当在我的程序中运行 jframe 时我的整个程序暂停 直到我按下按钮 我该怎么做 in c getch 做这个 我想要一个这样的功能 通过睡眠暂停执行 http dow
  • Mac OSX 上使用 Java 7 的透明 JFrame/JWindow

    我们有一个屏幕共享小程序 它打开 Swing JFrame 并使用 Robot 类捕获空框架后面的屏幕 用户可以单击框架并与小程序后面的任何内容进行交互 这在 Windows 上运行良好 并且用于 Apple 的 Java 版本 但对于 M
  • 测试正确的时区处理

    我们正在处理大量数据 所有数据均以 UTC Java 语言 标记 在读取这些数据 将其存储在数据库中以及再次将其取出之间 发生了一些数据在夏令时期间关闭一小时的情况 由于 UTC 没有夏令时的概念 这显然是软件中的一个错误 一旦知道 就很容
  • 在 Scala 中创建 Java 对象

    我有一个 Java 类 Listings 我在 Java MapReduce 作业中使用它 如下所示 public void map Object key Text value Context context throws IOExcept
  • IntelliJ 对于 Java 项目使用的默认构建过程是什么?

    直接从 IntelliJ 中的 IDE 构建 Java 项目非常好 它速度很快 而且很有效 我无法找到任何有关 IntelliJ 如何进行这些默认构建的文档 我猜它使用Ant 我想做的是为下载我的项目的任何人自动化这个快速 轻松的构建过程
  • 为什么我用Java计算的结果是错误的?

    我使用这段代码来计算一些东西 但几乎在所有情况下结果都是 0 0 为什么 编译器中没有警告或错误 private void jButton1ActionPerformed java awt event ActionEvent evt try
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 如何修复 java.lang.ClassNotFoundException: org.springframework.boot.configurationprocessor.json.JSONException 错误?

    当我在生产环境中将 Spring Boot 服务作为 Windows 服务运行时 出现以下错误 服务exe的创建者是Jar2exe https www jar2exe com java lang reflect InvocationTarg

随机推荐

  • Android HttpClient Cookie

    Android HttpClient 是否可以自动管理 cookie 它确实支持它 阅读下面的帖子 似乎在调用执行时必须传递相同的 HttpContext response httpClient execute httpPost local
  • 不必要的水平滚动条jqGrid

    在我的 jqGrid 使用版本 4 0 0 中 我得到了一个不必要的水平滚动条 但也有一个垂直滚动条 此问题仅出现在 Chrome 和 Firefox 中 但不会出现在 Internet Explorer 中 看起来表格宽度的计算有问题 因
  • Java Swing:实现输入值的有效性检查

    在我的 Swing 应用程序中 用户必须在切换到下一个窗口之前插入数字和值 现在 作为一个干净的程序应该检查每个输入是否有效 如果无效 则会显示错误消息并且不会打开下一个窗口 该检查的结构如下 示例 Button buttonToOpenN
  • 使用 .htaccess 从 URL 中删除 PHP 文件扩展名

    我刚刚在 Ubuntu 12 上安装完 LAMP 堆栈 并遇到了 Apache 的 htaccess 文件的问题 我启用了重写和重定向 mods 并且 htaccess 文件正在工作 如果不存在 www URI 将重定向到 www 但无论我
  • 如何使用 GWT 检查给定的图像 URL 是否存在?

    我想检查给定的 URL 是否存在并且它是一个图像 以便创建一个new Image String url 从中 如果给定的 URL 不是图像 那么它应该返回错误 我一直在寻找同样的东西 我想确定何时未从 URL 加载图像 有一个 ErrorH
  • 如何使用 Angular 动态加载 CSS

    在过去的几天里 我一直在尝试解决这个问题的几个答案 建议和教程 但不幸的是他们都没有成功 最接近的是这样的 https juristr com blog 2019 08 dynamically load css angular cli 但它
  • 如何交换字符串中的两个字符?

    我想写一个函数如下 输入 字符串 A int i 0 输出 将 i 1 处的字符与 i 处的字符交换的字符串 A 什么是clean能够实现这一目标的解决方案 我目前的解决方案是 let mut swapped input str 0 i t
  • React中createStore和createStoreWithMiddleware有什么区别?

    我找到了两种配置 redux createStore 的方法 1 https github com TeamWithBR SampleProjectTodo blob master src store configureStore js 2
  • ASP.NET MVC - 填充下拉列表

    我是 ASP NET MVC 新手 我试图弄清楚如何根据数据库中的值创建基本下拉列表 在 ASP NET Web 表单中 我知道我可以加载如下下拉列表 页面 aspx
  • 检查数组是否有一个或多个空值[重复]

    这个问题在这里已经有答案了 我有数组 var 如果数组中的一个或多个元素为空 我的意思是 字符串是 我想返回 FALSE 我觉得array filter 是更好的方法 但我不知道如何以这种方式过滤它 我该怎么做 函数emptyElement
  • 仅使用内置库使用 Python 制作基本的网络抓取工具 - Python

    学习Python 我试图制作一个没有任何第三方库的网络爬虫 这样这个过程对我来说就不会被简化 而且我知道我在做什么 我浏览了一些在线资源 但所有这些资源都让我对某些事情感到困惑 html 看起来像这样 lots of other div t
  • 有没有一个公式可以将纬度和经度转换为单个数字?

    你能告诉我是否有一个公式可以将纬度和经度转换为单个数字 我计划将其用于提供交付路由的软件中的数据库表 表行将包含该号码以及邮政地址 数据库表将按数字升序排序 以便软件可以找出卡车需要前往第一个 第二个等的地址 请您回复显示 VB 或 VB
  • 如何指定运行脚本的python版本?

    我现在正在使用预装 python 2 7 5 的 mac 学习 python 但我也安装了最新的3 4 我知道如何选择在命令行模式下使用哪个解释器 即 python vs python 3 将调出各自的解释器 但是 如果我只是编写一个包含此
  • 自定义自动隐藏浮动操作按钮行为不起作用

    我试图在 NestedScrollView 向下滚动时隐藏 FloatingActionButton 并在 NestedScrollView 向上滚动时显示自身 这是我的布局
  • 如何内省 Django 中的属性和模型字段?

    我正在尝试获取给定对象的所有现有模型字段和属性的列表 有没有一种干净的方法来内省对象 以便我可以获得字段和属性的字典 class MyModel Model url models TextField def get location sel
  • 将 JTextField 输入转换为 Integer

    我是 JAVA 新手 我试图将 JTextField 的输入转换为整数 我尝试了很多选项 但没有任何效果 Eclipse 总是给我一个错误 并且这些错误对我来说没有意义 导入java awt Graphics 导入java awt Colo
  • 如何访问 MediaBrowserServiceCompat 服务的实例?

    令人惊讶的是 我正在努力获取源自以下内容的服务实例 MediaBrowserServiceCompat 对于典型的服务 为了实现这一点 使用本地绑定器 class MyService extends MediaBrowserServiceC
  • Angular 5 - 在运行时动态加载模块(在编译时未知)

    Angular 5 是否可以动态加载编译时未知但运行时未知的模块 组件 我想这不会使用 webpack 工作 但也许使用 system js EDIT 整个想法是构建一个基于插件的应用程序 其中各个插件被放入插件文件夹中 Angular 将
  • 为多个按钮实现 onTouchListener() 的单一方法

    我想看看是否有一种方法可以创建一个方法来实现多个按钮的触摸侦听器 因为我有很多按钮几乎可以完成相同的操作 他们所做的唯一区别是他们通过我的 sendMessage 方法发送的消息 以及需要按住按钮多长时间才能发送消息 如果有办法做到这一点
  • JSF 2.0:如何在使用 HttpServletRequest.login 后重定向到受保护页面

    我正在尝试将 HttpServletRequest login 与基于表单的身份验证一起使用 一切都很好 容器告诉登录名 密码是否正确 除了用户输入登录名后 我不知道如何将用户重定向到他要求的受保护页面 重新显示登录表单 怎么做 在此先感谢