Как войти в систему, когда пользователь нажимает на ссылку активации электронной почты? (JSF 2.0) - PullRequest
1 голос
/ 18 апреля 2011

Я отправляю почту активации учетной записи своим пользователям, используя 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;
    }


}

Этотакое 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;
    }

Можно ли вызвать метод saveUserState(email,password) из шаблона, который я вручную создал в методе generateActivationLinkTemplate()?Таким образом, пользователь перенаправляется на главную страницу приложения, а пользователь сохраняется в сеансе

1 Ответ

7 голосов
/ 18 апреля 2011

Если вы передаете ключ активации в качестве параметра запроса в ссылке, такой как http://example.com/activate.xhtml?key=somelonganduniquekey,, просто используйте @ManagedProperty, чтобы JSF установил параметр запроса в бине и выполнил задание проверки и входа в систему в @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.
    }

    // ...
}

с 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>
...