【问题标题】:How to conform email using Java?如何使用 Java 确认电子邮件?
【发布时间】:2013-03-19 14:44:49
【问题描述】:

实际上在我的 java 应用程序中注册是他们的,所以我将邮件发送到用户电子邮件。

<bean id="activateAccountTemplate" class="org.springframework.mail.SimpleMailMessage">
    <property name="subject" value="Account activation" />
    <property name="text">
        <value>
        <![CDATA[
            <html><body><p>Dear %s</p><p>Click <a href="http://localhost:8080/EClass/reset.jsp?a=%s">here</a> to activate your account.</p></body></html>
        ]]>
        </value>
    </property>
</bean>

所以这是完美的工作。点击链接后

http://localhost:8080/EClass/reset.jsp?a=tdpTA3Dz8DYSI+9F/DpMxmxGD/a1Kl+3oYqXc1NNH0U=

听说我正在使用加密机制。

我的数据库有类似..S_id, username, password, active(T/F)的列。

我的要求是当注册Active 时总是F(false) 但点击链接后active 将是true(当ever Active 为真时只允许登录)。

那么在reset.jsp中怎么做呢?其实我的想法是

  1. 为此编写一个控制器并更新Active 列是True(但是如何为此获取sid)

  2. 获取 SID,实际上会生成上面显示的加密密钥,因此该密钥将被解密并发送到控制器,并使用 DB Query 选择特定用户并将活动设置为 true。(但还要了解如何获取 url 密钥... request.getParameter(?))

请给我建议……我不知道该怎么做……

reset.jsp上提供一些示例代码

编辑:实际上我遵循 MVC 原则,所以没有 reset.jsp 如何编写直接控制器类..

【问题讨论】:

    标签: java spring hibernate jsp email


    【解决方案1】:

    你的 reset.jsp 可能是这样的:

    <%
        String token = request.getParameter("a");
    
        // Connection to DB executing this query :
        // "UPDATE users SET active = true WHERE S_id = " + token
    %>
    

    由于您可能已经编写了访问数据库的代码,因此我不会包含此示例部分,但它会让您走上正轨。如果有一行更新,如果它工作正常,如果没有更新行,则将信息返回给用户,以验证他们的 URL,这也是非常有用的。

    希望对您有所帮助。

    编辑:

    与 Servlet 相同的方法:

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class Reset extends HttpServlet {
    
      public void doGet(HttpServletRequest request, HttpServletResponse response)
                                   throws ServletException, IOException {
        String token = request.getParameter("a");
    
        // Connection to DB executing this query :
        // "UPDATE users SET active = true WHERE S_id = " + token
    
        response.setContentType("text/html");
        PrintWriter out = res.getWriter();
    
        out.println("<HTML><BODY>Your response to the user depending on rows updated from SQL</BODY></HTML>");
      }
    }
    

    您还需要在 web.xml 中定义:

    <servlet>
      <servlet-name>reset</servlet-name>
      <servlet-class>myservlets.reset</servlet-class>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>reset</servlet-name>
      <url-pattern>/reset</url-pattern>
    </servlet-mapping>
    

    并更改您的链接:

    <a href="http://localhost:8080/EClass/reset?a=%s">here</a>
    

    编辑:

    与 Spring Controler 方法相同:

    @Controller
    @RequestMapping(value = "/activation"
    public class AccountActivationController
    {
        @RequestMapping(method = RequestMethod.GET)
        public String setupForm(@RequestParam("a") String token, ModelMap model) {
            // Connection to DB executing this query :
            // "UPDATE users SET active = true WHERE S_id = " + token
    
            return successful ? "activationSuccessful" : "activationError";
        }
    }
    

    帮不上什么忙,因为我以前从未做过 Spring……

    【讨论】:

    • Actullay 我使用的是 MVC,所以如果有可能在不使用 reset.jsp 的情况下编写 Direct Contrllor 类
    • 我已经更新了答案。另外我认为激活当然是比重置更好的名称!
    • 感谢您的重播。但是我在 Spring 中使用,所以是否可以创建一些控制器类并让所有 DB 的东西都听到?..
    • 我从我的研究中添加了示例 Spring Controler 代码,因为我从未在 Spring 中开发过,也没有经过测试。
    • 谢谢,最后一个……是不是需要写web.xml的servlet标签?
    【解决方案2】:

    你应该把 active 和其他东西放到一个单独的表中。

    table user
    
    id   username   password
    
    
    table activation
    
    id active expired_time token user_id
    

    用户完成注册后,应将一条记录插入到激活表中。活动字段为假,过期时间为现在后 2 小时,等等。

    然后使用令牌查表并做主动工作。

    【讨论】:

    • 哦.. 非常感谢你的这个想法.. 我忘记了这个......请帮助我如何使用请求 url 编写 spring 控制器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2012-01-23
    • 2014-11-03
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多