点击电子邮件激活链接时如何登录用户?(JSF 2.0)

sfr*_*frj 1 java jsf jakarta-mail java-ee jsf-2

我使用javamail向用户发送帐户激活邮件.在该电子邮件中,有一个链接,当点击时,用户应激活他们的帐户,重定向到应用程序的主页并让他们登录.我怎么能这样做?我可以在我作为HTML模板发送的链接中添加对方法调用的方法调用吗?

这是我用于发送电子邮件模板的EJB:

@Stateless(name = "ejbs/EmailServiceEJB")
public class EmailServiceEJB implements IEmailServiceEJB {

    @Resource(name = "mail/myMailSession")
    private Session mailSession;

    public void sendAccountActivationLinkToBuyer(String destinationEmail,
            String name) {

        // Destination of the email
        String to = destinationEmail;
        String from = "dontreply2thismessage@gmail.com";

        try {
            Message message = new MimeMessage(mailSession);
            // From: is our service
            message.setFrom(new InternetAddress(from));
            // To: destination given
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(to));
            message.setSubject("Uspijesna registracija");
            // How to found at http://www.rgagnon.com/javadetails/java-0321.html
            message.setContent(generateActivationLinkTemplate(), "text/html");

            Date timeStamp = new Date();
            message.setSentDate(timeStamp);

            // Prepare a multipart HTML
            Multipart multipart = new MimeMultipart();
            // Prepare the HTML
            BodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent(generateActivationLinkTemplate(), "text/html");
            htmlPart.setDisposition(BodyPart.INLINE);

            // PREPARE THE IMAGE
            BodyPart imgPart = new MimeBodyPart();

            String fileName = "logoemailtemplate.png";

            ClassLoader classLoader = Thread.currentThread()
                    .getContextClassLoader();
            if (classLoader == null) {
                classLoader = this.getClass().getClassLoader();
                if (classLoader == null) {
                    System.out.println("IT IS NULL AGAIN!!!!");
                }
            }

            DataSource ds = new URLDataSource(classLoader.getResource(fileName));

            imgPart.setDataHandler(new DataHandler(ds));
            imgPart.setHeader("Content-ID", "<logoimg_cid>");
            imgPart.setDisposition(MimeBodyPart.INLINE);
            imgPart.setFileName("logomailtemplate.png");

            multipart.addBodyPart(htmlPart);
            multipart.addBodyPart(imgPart);
            // Set the message content!
            message.setContent(multipart);

            System.out.println("MIME!!!!");
            System.out.println(multipart.getContentType());

            Transport.send(message);

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }

    }    


    private String generateActivationLinkTemplate() {
        String htmlText = "";
        htmlText = "<table width=\"600\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">  <tr>    <td><img src=\"cid:logoimg_cid\"/></td>  </tr>  <tr>    <td height=\"220\"> <p>Thanks for Joining Site.com</p>      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>    <p>Username:<br />      Password: </p>    <p>To confirm your email click <a href=\"#\">here</a>.</p></td>  </tr>  <tr>    <td height=\"50\" align=\"center\" valign=\"middle\" bgcolor=\"#CCCCCC\">www.site.com | contact@site.com | +38200 123 456</td>  </tr></table>";
        return htmlText;
    }


}
Run Code Online (Sandbox Code Playgroud)

这是将在会话中保存用户状态的EJB(登录):

public class AuthentificationEJB implements IAuthentificationEJB {

    @PersistenceContext
    private EntityManager em;

    // Login
    public boolean saveUserState(String email, String password) {
        // 1-Send query to database to see if that user exist
        Query query = em
                .createQuery("SELECT r FROM Role r WHERE r.email=:emailparam AND r.password=:passwordparam");
        query.setParameter("emailparam", email);
        query.setParameter("passwordparam", password);
        // 2-If the query returns the user(Role) object, store it somewhere in
        // the session
        List<Object> tmpList = query.getResultList();
        if (tmpList.isEmpty() == false) {
            Role role = (Role) tmpList.get(0);
            if (role != null && role.getEmail().equals(email)
                    && role.getPassword().equals(password)) {
                FacesContext.getCurrentInstance().getExternalContext()
                        .getSessionMap().put("userRole", role);
                // 3-return true if the user state was saved
                System.out.println(role.getEmail() + role.getPassword());
                return true;
            }
        }
        // 4-return false otherwise
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

我可以saveUserState(email,password)从我在方法中手动创建的模板中调用该方法generateActivationLinkTemplate()吗?因此,用户被重定向到应用程序的主页面,用户将被保存到会话中

Bal*_*usC 7

如果您在http://example.com/activate.xhtml?key=somelonganduniquekey等链接中将激活密钥作为请求参数传递,那么只需使用@ManagedPropertyJSF在bean中设置请求参数并执行验证和登录作业在@PostConstruct.

@ManagedBean
@RequestScoped
public class Activation {

    @ManagedProperty(value="#{param.key}")
    private String key;

    private boolean valid;

    @PostConstruct
    public void init() {
        // Get User based on activation key.
        // Delete activation key from database.
        // Login user.
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

activate.xhtml它看起来像这样

<h:head>
    <ui:fragment rendered="#{activation.valid}">
        <meta http-equiv="refresh" content="3;url=home.xhtml" />
    </ui:fragment>
</h:head>
<h:body>
    <h:panelGroup layout="block" rendered="#{activation.valid}">
        <p>Your account is successfully activated!</p>
        <p>You will in 3 seconds be redirected to <h:link outcome="home">home page</h:link></p>
    </h:panelGroup>
    <h:panelGroup layout="block" rendered="#{!activation.valid}">
        <p>Activation failed! Please enter your email address to try once again.</p> 
        <h:form>
            ...
        </h:form>
    </h:panelGroup>
</h:body>
Run Code Online (Sandbox Code Playgroud)