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()吗?因此,用户被重定向到应用程序的主页面,用户将被保存到会话中
如果您在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)
| 归档时间: |
|
| 查看次数: |
7031 次 |
| 最近记录: |