从servlet安全地将参数传递给EJB?

时间:2013-03-03 05:43:44

标签: java ejb parameter-passing

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

  • 来自
  • BCC
  • CC
  • 主题
  • 身体

努力将模型EJB)与视图JSP)和控制器(servlet),我想避免将 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!"; 
    }
}

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

  

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

非常好。 HttpServletRequest属于Web层,不应传递给业务层。

  

我应该使用Session变量吗?

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

  

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

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

  

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

将其视为将一种表示适应另一种表示 - 这不是业务逻辑。 BL是你的需求直接影响的,你在这里做的只是架构。