【问题标题】:Securely passing parameters to EJB from servlet?从 servlet 安全地将参数传递给 EJB?
【发布时间】:2013-03-03 17:37:20
【问题描述】:

将多个 HTTP 参数从 servlet 传递到 EJB 的安全规范方法是什么?该应用程序是一个基于 Web 的 SMTP 客户端,它采用以下参数:

  • 来自
  • 密件抄送
  • 抄送
  • 主题
  • 身体

努力将 model (EJB) 与 view (JSP) 和 controller (@987654323) 分开@),我不想将 HttpServletRequest 直接传递给 EJB

  • 我应该使用Session 变量吗?
  • 我应该传递 6 个参数吗?要传递这 6 个参数,我必须在控制层中执行业务逻辑。

代码:

 public String send_message(HttpServletRequest request) {
    try {
        Properties properties = System.getProperties();
        properties.put("mail.smtp.host", SMTP_HOST);
        Session session = Session.getInstance(properties, null);

        String from = request.getParameter("from");
        String to = request.getParameter("to");
        String cc = request.getParameter("cc");
        String bcc = request.getParameter("bcc");
        String subject = request.getParameter("subject");
        String body = request.getParameter("body");

        MimeMessage message = new MimeMessage(session);             
        Address sender = new InternetAddress(from);
        message.setFrom(sender);

        Address[] toAddresses = InternetAddress.parse(to);
        message.setRecipients(Message.RecipientType.TO, toAddresses);

        Address[] ccAddresses = InternetAddress.parse(cc);
        message.setRecipients(Message.RecipientType.CC, ccAddresses);

        Address[] bccAddresses = InternetAddress.parse(bcc);
        message.setRecipients(Message.RecipientType.BCC, bccAddresses);

        message.setSubject(subject);                
        message.setText(body);  

        Transport.send(message);
        return "Your message was sent successfully!";
    } catch (AddressException AE){
        return "Oops! There was an error parsing the addresses!";
    } catch (SendFailedException SFE){
        return "Oops! There was an error sending the message!";
    } catch (MessagingException ME){
        return "Oops! There was an error sending the message!"; 
    }
}

有什么建议吗?

【问题讨论】:

  • 我不想破坏,但如果你正在学习 jsp,你应该考虑到这是一种有利于 JSF 的弃用技术
  • 不幸的是,过渡到现代技术不是一种选择。

标签: java ejb parameter-passing


【解决方案1】:

我想避免将 HttpServletRequest 直接传递给 EJB。

非常好。 HttpServletRequest 属于 web 层,千万不要传给业务层。

我应该使用 Session 变量吗?

出于同样的原因,这不是一个好主意。 Session 也属于 servlet 层。此外,在设计良好的应用程序中,这可能根本不可能; Web 组件依赖于 EJB 组件,而不是相反。在 EJB 中使用 session 意味着颠倒这种关系。

我应该传递 6 个参数吗?要传递这 6 个参数,我必须在控制层中执行业务逻辑。

六个参数非常接近“很多”,如果不是的话。就个人而言,我认为这种情况值得引入一个新的参数对象(又名值对象,又名传输对象)来保存这些值。尤其是当你编写一个新代码时,设计一个有 6 个参数定义相同概念的方法是一种罪过——邮件。多参数方法难以阅读并且容易出现“破窗效应”——鼓励在需要扩展时添加另一个参数。

要传递这 6 个参数,我必须在控制层中执行业务逻辑。

将其视为将一种表示形式调整为另一种表示形式——这不是业务逻辑。 BL 直接受您的要求影响,您在这里所做的只是架构。

【讨论】:

  • 那么,我应该创建一个 POJO 来解析 HTTPServletRequest 吗?或者我应该解析 servlet 中的 HTTPServletRequest 吗?创建 POJO 或辅助 EJB 来解析 6 个参数似乎也太过分了。
  • 如果解析只是从request获取参数,我会把它留在servlet中;如果它很复杂,我可能会创建一个转换器类来做到这一点。我的意思是创建一个 POJO 来传递六个参数从 servlet 到 EJB,而不是用于解析它们(请谷歌搜索“传输对象”或“值对象”EJB 设计模式)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2015-04-06
  • 2017-12-16
  • 2015-01-06
  • 2014-05-25
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多