Java EE 6 应用程序客户端登录

2023-12-04

我对 Java EE 很陌生,在开始创建我想要创建的应用程序时遇到了很多麻烦。我想要的是一个连接到 EJB 项目的 Swing 应用程序客户端。我正在使用 Glassfish v3.1.1。到目前为止,我拥有的是两个无状态 bean,其中一个是使用 @DeclareRoles 和 Glassfish 中的 JDBC 领域以及客户端的开始来保护的。

当客户端运行时,您可以选择用户名,输入密码,然后登录。如果您使用正确的密码,一切都会正常(客户端控制台会显示一些“安全”信息)。但是,如果您输入错误的密码,您将被永久锁定。 InitialContext.lookup 不会再次调用 CallbackHandler 来检查新密码,它会继续使用不正确的凭据。

有人可以告诉我如何正确执行此操作吗?对于这种情况,我是否使用了正确的方法 - 网络上有大量信息,但基本上没有我想要做的事情的示例?一切似乎只适用于 J2EE 或 Servlet!这是一些相关代码。

glassfish-ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
  <security-role-mapping>
    <role-name>Admin</role-name>
    <group-name>Admin</group-name>
  </security-role-mapping>
  <security-role-mapping>
    <role-name>Employee</role-name>
    <group-name>Employee</group-name>
  </security-role-mapping>
  <enterprise-beans>
    <ejb>
      <ejb-name>LoginBean</ejb-name>
      <jndi-name>ejb/machineryhub/LoginService</jndi-name>
    </ejb>
    <ejb>
      <ejb-name>EmployeeBean</ejb-name>
      <jndi-name>ejb/machineryhub/EmployeeService</jndi-name>
      <ior-security-config>
        <as-context>
          <auth_method>username_password</auth_method>
          <realm>machineryhub</realm>
          <required>true</required>
        </as-context>
      </ior-security-config>
    </ejb>
  </enterprise-beans>
</glassfish-ejb-jar>

我需要添加<ior-security-config>阻止我创建的每个安全 bean?

应用程序客户端.xml:

<?xml version="1.0" encoding="UTF-8"?>
<application-client version="6" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application-client_6.xsd">
  <display-name>MachineryHub</display-name>
  <ejb-ref>
    <ejb-ref-name>LoginBean</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <remote>machineryhub.service.LoginService</remote>
  </ejb-ref>
  <ejb-ref>
    <ejb-ref-name>EmployeeBean</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <remote>machineryhub.service.EmployeeService</remote>
  </ejb-ref>
  <callback-handler>machineryhub.LoginCallbackHandler</callback-handler>
</application-client>

机械中心。登录回调处理程序:

public class LoginCallbackHandler implements CallbackHandler {

  @Override
  public void handle(Callback[] clbcks) throws IOException, UnsupportedCallbackException {
    LoginFrame l = LoginFrame.instance;
    for (Callback cb : clbcks) {
      if (cb instanceof NameCallback) {
        NameCallback ncb = (NameCallback) cb;
        ncb.setName(l.usernameCombo.getSelectedItem().toString());
      } else if (cb instanceof PasswordCallback) {
        PasswordCallback pcb = (PasswordCallback) cb;
        pcb.setPassword(l.passwordText.getPassword());
      } else {
        throw new UnsupportedCallbackException(cb);
      }
    }
  }
}

现在是长篇大论,swing 应用程序客户端。

机械中心.LoginFrame

public class LoginFrame extends JFrame implements ActionListener {

  public static LoginFrame instance;

  public static void main(String[] args) {
    // Handle uncaught exceptions in the main and Swing threads
    ExceptionHandler.registerExceptionHandler();

    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        try {
          UIManager.setLookAndFeel(new SubstanceMistSilverLookAndFeel());
          JFrame.setDefaultLookAndFeelDecorated(true);
          JDialog.setDefaultLookAndFeelDecorated(true);
          (new LoginFrame()).setVisible(true);
        } catch (final Exception exception) {
          ExceptionHandler.handle(Thread.currentThread(), exception);
        }
      }
    });
  }
  public JComboBox usernameCombo;
  public JPasswordField passwordText;
  private JButton loginButton;

  public LoginFrame() {
    // Window Setup

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Login :: MachineryHub");
    this.setLocationRelativeTo(null);
    this.setIconImages(IconFactory.application_images);

    // Create GUI

    createGui();
    usernameCombo.requestFocusInWindow();
    LoginFrame.instance = this;
  }

  private void createGui() {
    // Content Pane
    final JPanel contentPanel = new JPanel();

    List<String> usernames = getLoginService().getUsernames();
    Collections.sort(usernames);
    usernameCombo = new JComboBox(usernames.toArray());
    passwordText = new JPasswordField(15);
    passwordText.setActionCommand("Login");
    passwordText.addActionListener(this);

    loginButton = new JButton("Login", IconFactory.getImageIcon(IconFactory.Icon.KEY, 16));
    loginButton.setActionCommand("Login");
    loginButton.addActionListener(this);

    GroupLayout layout = new GroupLayout(contentPanel);
    contentPanel.setLayout(layout);
    layout.setAutoCreateContainerGaps(true);
    layout.setAutoCreateGaps(true);

    layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(usernameCombo).addGroup(layout.createSequentialGroup().addComponent(passwordText).addComponent(loginButton)));

    layout.setVerticalGroup(layout.createSequentialGroup().addComponent(usernameCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE).addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(passwordText).addComponent(loginButton)));

    this.setContentPane(contentPanel);
    this.pack();
  }

  @Override
  public void actionPerformed(final ActionEvent e) {
    if (e == null || e.getActionCommand() == null) {
      return;
    }

    if (e.getActionCommand().equals("Login")) {
      loginButton.setEnabled(false);
      passwordText.setEnabled(false);
      usernameCombo.setEnabled(false);
      loginButton.setIcon(IconFactory.getImageIcon(IconFactory.SpecialImage.LOADING));

      try {
        Context c = new InitialContext();

        EmployeeService es = (EmployeeService) c.lookup("ejb/machineryhub/EmployeeService");
        System.out.println("Number of employees: " + es.getAllEmployees().size());
        this.dispose();
      } catch (NamingException exception) {
        loginButton.setEnabled(true);
        passwordText.setEnabled(true);
        usernameCombo.setEnabled(true);
        loginButton.setIcon(IconFactory.getImageIcon(IconFactory.Icon.KEY, 16));
        JOptionPane.showMessageDialog(LoginFrame.this, "Login Error: " + exception.getMessage(), "Login Error! :: MachineryHub", JOptionPane.ERROR_MESSAGE);
      }
    }
  }

  private LoginService getLoginService() {
    try {
      Context c = new InitialContext();
      return (LoginService) c.lookup("ejb/machineryhub/LoginService");
    } catch (NamingException ne) {
      throw new RuntimeException(ne);
    }
  }
}

我不确定这是best or 受到推崇的解决这个问题的方法,但我找到了一种方法来做我需要的事情。解决方案在于使用ProgrammaticLogin班级。我删除了LoginCallbackHandler类和参考application-client.xml。然后在登录代码中,就在创建之前InitialContext,我使用了以下非常简单的两行:

ProgrammaticLogin pl = new ProgrammaticLogin();
pl.login(usernameCombo.getSelectedItem().toString(), passwordText.getPassword());

无论我输入错误密码多少次,这似乎都有效(您也可以使用简单的计数器对此进行限制)。我觉得花了这么长时间才弄清楚这一点有点愚蠢,但这个类没有出现在 Netbeans 中,所以我认为它在 Java EE 6 中不再有效。然而,这只是一个添加的问题Glassfish/modules/security.jar到图书馆让它出现。

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

Java EE 6 应用程序客户端登录 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 如何实现线性插值?

    假设我得到的数据如下 x 1 2 5 3 4 5 8 6 y 2 4 5 8 4 3 4 我想设计一个函数 它将在之间线性插值1 and 2 5 2 5 to 3 4 等等使用Python 我尝试过浏览这个Python教程 但我仍然无法理解
  • 使用 C# 将 Internet Explorer 浏览器嵌入到 Winforms 中

    我正在尝试使用 IE 打开指定 IP 的网页 为什么是 IE 因为并非每个 Windows 都安装了 Chrome 或 Firefox 并将其呈现在一个简单的 Winforms 窗口中 上面提到的网页是一个 BI 商业智能 网页 它会动态更
  • 如何解释CUDA中的指令重放

    谁能总结一下 CUDA 中不同类型的指令重放的定义和原因吗 他们是 inst replay overhead 共享重播开销 全局重播开销 全局缓存重播开销 本地重播开销 原子重播开销 共享加载重播 共享存储重播 global ld mem
  • FacesContext 无法在带有 JSF 2.3 的 Wildfly 14 中注入(Mojarra,主模块)

    我有一颗豆子 import javax faces context FacesContext import javax faces view ViewScoped Named ViewScoped public class SimpleBe
  • 无法使用 Shenandoah GC

    我不能放谢南多厄GC在尝试运行 Java 应用程序时工作 无论我尝试什么 调用时的输出如下java来自终端 或 CMD 的命令 VM初始化期间发生错误 不支持选项 XX UseShenandoahGC 在 Ubuntu WSL 和 Wind
  • 在 WPF MVVM 应用程序中添加材料设计后,数据网格不显示滚动条并且设计已过时

    我在 WPF MVVM 应用程序中使用了 Material Design 和 Dragablz TabablzControl Material Design 用于设置按钮和文本框的样式 网格位于选项卡控件内部 将批量数据加载到数据网格后 我
  • Log4j2 无法在 WebLogic 12.2.1 中工作

    我试图在 WebLogic 12 2 1 下运行的 Web 服务中添加 log4j 日志记录 但不知何故日志记录不起作用 这是我的 WAR 文件的 WEB INF classes 中的 log4j2 xml
  • 注册应用程序以打开图像文件

    我已成功注册我的应用程序以打开 PDF 文件 方法是将以下内容包含在我的 info plist 中
  • 最新浏览器中抛出 getusermedia DevicesNotFoundError

    我已经在 WebRtc 上使用 getUserMedia 一段时间了 但自从浏览器最新更新以来我一直无法使用它 在以前的版本上工作得很好 受影响的浏览器版本 火狐 57 0 4 铬 63 0 3239 132 示例代码 navigator
  • 引导程序启动时如何关闭菜单折叠?

    我有一个使用 Drupal 8 和 Bootstrap 3 构建的网站 如何在引导程序 Tour 启动时关闭菜单折叠 https www s1biose com 单击左侧菜单中的 开始参观 即可开始 游览 我希望单击 开始访问 按钮时 左右
  • Windows Xp 上的 Microsoft.Windows.ActCtx

    这些天我非常忙于开发一个 activex com 应用程序 我们的一些客户在严格限制的 Windows 环境下工作 所以我决定让我的应用程序免注册 我发现 genman32 exe 可以轻松创建清单 mt exe 也很有用 一切都很顺利 但
  • 如何在极坐标 matplotlib 图上绘制带有文本(即标签)的水平线? (Python)

    我正在尝试在极坐标图中标记节点 有 3 个被分割的 轴 我已经弄清楚如何使用象限来选择要标记的节点 但是 我不知道如何在图的边缘对齐这些 即axis maximum 我花了几个小时试图弄清楚这一点 我最好的选择是用 在左边或右边 但这是一个
  • HTML 加载动画

    我的网站在页面未加载时丢失了布局方案 我想做的是将动画链接到加载进度 就像进度条但没有进度条 例如 一个简单的动画 将进度与徽标的不透明度联系起来 因此 当页面加载 50 时 徽标的不透明度为 50 当徽标为 100 时 页面已加载 加载进
  • Silverlight FTP 上传

    我正在尝试通过 silverlight 应用程序将文件 ftp 到服务器 服务器文件系统上上传文件的位置位于 Web 服务器的沙箱区域之外 在这种情况下 Web 服务器根目录位于 C test www 上传文件的位置将位于 C User U
  • AWS cli 列出未使用的 elb

    我对 AWS 还很陌生 我试图列出未附加到任何实例的负载平衡 我尝试使用 aws cli 描述负载均衡器 但无法获得过滤 elb 的选项 请提供一些关于如何实现这一目标的建议 假设您已使用合适的密钥设置了 aws cli 这一长行 shel
  • Azure ML 免费试用:如何提​​交管道?

    我正在 MS Azure 上使用免费试用帐户 并且正在遵循本教程 https learn microsoft com en us azure machine learning tutorial designer automobile pri
  • 当我使用远程调用或 jQuery 远程加载部分/内容时,jquery ujs 不起作用

    我有一段 jQuery 代码 它用一些内容填充页面上的元素 var content note note id html another div html content 这很好地替换了另一个 div 的 html 但问题是任何数据远程属性都
  • 使用 Flexbox 出现意外的空白空间

    在问题仍然存在的情况下 我已将问题减少到最低限度 我不明白橙色空间是从哪里来的 A clue 删除一张图像 橙色空间就会消失 OutterContainer display flex flex wrap wrap flex directio
  • word vba 循环执行 if find.found

    我正在尝试使用 Word VBA 循环浏览文档 我想做的是 如果我发现 Text A vbTab 然后我想将其替换为 A 然后转到该行末尾 按一次 DEL 键并键入 br 但我无法管理它 当我运行这段代码时 不知何故 word 不断崩溃 S
  • Java EE 6 应用程序客户端登录

    我对 Java EE 很陌生 在开始创建我想要创建的应用程序时遇到了很多麻烦 我想要的是一个连接到 EJB 项目的 Swing 应用程序客户端 我正在使用 Glassfish v3 1 1 到目前为止 我拥有的是两个无状态 bean 其中一