当前位置: 首页 > 知识库问答 >
问题:

在java中重置密码链接

米楚青
2023-03-14

我目前正在一个Java项目中实现忘记密码功能。我的方法是,

>

  • 用户单击忘记密码链接。

    在忘记密码页面中,系统提示用户输入他/她在系统中注册的电子邮件地址。

    包含给定电子邮件地址和重置密码页面链接的电子邮件。

    用户单击链接,他/她会被重定向到一个页面(重置密码),用户可以在其中输入他的新密码。

    在重置密码页面中,“电子邮件地址”字段自动填充,并且由于其被禁用,因此无法更改。

    然后用户输入他的新密码,与数据库中的电子邮件地址相关的字段被更新。

    我在代码中尝试了这一点,但在重置密码页面中,我没有获得想要更改密码的用户的电子邮件id。

    MailUtil。Java语言

    package com.example.controller;
    
    import java.io.IOException;
    import java.security.Security;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    import javax.mail.Message;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    
    import com.example.util.Database;
    
    public class MailUtil {
        private static final String USERNAME = "test@gmail.com";
        private static final String PASSWORD = "test";
        private static final String SUBJECT = "Reset Password link";
    
        private static final String HOST = "smtp.gmail.com";
        private static final String PORT = "465";
    
        String email;
    
        public MailUtil() {
        // TODO Auto-generated constructor stub
        email = this.email;
    }
    
        public boolean sendMail(String to, HttpServletRequest request) throws SQLException, ServletException, IOException{
            Connection conn = Database.getConnection();
            Statement st = conn.createStatement();
            String sql = "select * from login where email = '" + to + "' ";
            ResultSet rs = st.executeQuery(sql);
            String pass = null;
            String firstName = null;
            while(rs.next()){
                pass = rs.getString("pass");
                firstName = rs.getString("firstName");
            }
    
            if(pass != null){
                setEmailId(to);         
                Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
                Properties props = new Properties();
                props.put("mail.smtp.host", HOST);
                props.put("mail.stmp.user", USERNAME);
                //  If you want you use TLS
                //props.put("mail.smtp.auth", "true");
    
                props.put("mail.smtp.starttls.enable", "true");
                props.put("mail.smtp.password", PASSWORD);
                //  If you want to use SSL
                props.put("mail.smtp.port", PORT);
                props.put("mail.smtp.socketFactory.port", PORT);
                props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
                props.put("mail.smtp.auth", "true");
    
                Session session = Session.getInstance(props, new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        String username = USERNAME;
                        String password = PASSWORD;
                        return new PasswordAuthentication(username, password);
                    }
                });
    
                String from = USERNAME;
                String subject = SUBJECT;
                MimeMessage msg = new MimeMessage(session);
                try{
                    msg.setFrom(new InternetAddress(from));
                    InternetAddress addressTo = new InternetAddress(to);
                    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
                    msg.setSubject(subject);                
                    String vmFileContent = "Hello User, <br><br> Please Click <a href='http://192.168.15.159:8080/SampleLogin/new-password.jsp><strong>here</strong></a> to reset your password. <br><br><br> Thanks,<br>ProAmbi Team";
    
                    //  Send the complete message parts
                    msg.setContent(vmFileContent,"text/html");
                    Transport transport = session.getTransport("smtp");
                    transport.send(msg);
    
                    System.out.println("Sent Successfully");
                    return true;
                }catch (Exception exc){
                    System.out.println(exc);
                    return false;
                }
            }else{
                //System.out.println("Email is not registered.");
                request.setAttribute("errorMessage", "User with this email id doesn't exist.");         
                return false;
            }
        }
    
        public String getEmailID() {
            return email;
        }
        public void setEmailId(String email) {
            this.email = email;
        }
    }
    

    还有我的新密码。jsp。

    <%
        MailUtil mail = new MailUtil();
        String email = mail.getEmailID();
        System.out.println("---> "+email);
    %>
    

    但我得到的是空值,而不是电子邮件id。

    你能帮我解决这个问题或得到任何其他选择这样做。

  • 共有1个答案

    古文康
    2023-03-14

    我建议你使用JWT令牌-https://jwt.io/

     public String createToken( Email mail )
      {
          Claims claims = Jwts.claims().setSubject( String.valueOf( mail.getId() ) );
            claims.put( "mailId", mail.getId() );
            Date currentTime = new Date();
            currentTime.setTime( currentTime.getTime() + tokenExpiration * 60000 );
            return Jwts.builder()
              .setClaims( claims )
              .setExpiration( currentTime )
              .signWith( SignatureAlgorithm.HS512, salt.getBytes() )
              .compact();
      }
    

    此代码将返回令牌字符串表示。因此,您将发送带有此令牌的电子邮件,例如:

    "您要求更改密码。请单击此链接输入新密码"

    http://yourapp.com/forgotPassword/qwe213eqwe1231rfqw

    然后在加载的页面上,您将从请求中获取令牌,对其进行编码并获得您想要的内容。

    public String readMailIdFromToken( String token )
      {
        Jwts.parser().setSigningKey( salt.getBytes() ).parseClaimsJws( token ).getSignature();
        Jws<Claims> parseClaimsJws = Jwts.parser().setSigningKey( salt.getBytes() ).parseClaimsJws( token );        
        return parseClaimsJws.getBody().getSubject();
      }
    

    如果指定的时间已过,过期将使您的令牌无效。Salt可以用任何类型的字符串替换,您可以在JWT文档中阅读详细信息。这种方法也可用于注册确认电子邮件。

    附笔

    1)不要使用scriplets(jsp的java代码),改用jstl

    2) 不要在sql查询中使用字符串连接。这很危险。改为使用准备好的语句。

    3) 对于主机/密码e.t.c.等信息,请使用属性文件

    4) 删除将DB调用到相应DAO的代码。(你应该阅读DAO模式)

    5) 不要使用系统。出来打印你的代码。使用任何类型的记录器。

    有用的链接:

    https://jstl.java.net/

    https://en.wikipedia.org/wiki/SQL_injection

    https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html

    https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm

    https://en.wikipedia.org/wiki/Multitier_architecture

     类似资料:
    • 我正在使用firebase来验证我的android应用程序中的用户。我在登录窗口中为用户提供了一个重置密码的选项。当用户点击按钮,它发送电子邮件成功。然而,当用户点击链接时,它总是显示 “请重置密码。重置密码的请求已过期,或链接已被使用” 2016年8月31日更新 我与firebase支持取得了联系,看起来API键有一些bug。如果更改浏览器API密钥,则不会更新。现在这个bug已经修复,重置密码

    • 介绍 {tip} 想要快速上手? 只需在一个新的 Laravel 应用中运行 php artisan make:auth 命令,然后在浏览器中访问 http://your-app.dev/register 或分配给应用的任何别的 URL。这条命令将搭建起整个身份验证系统,包括重置密码! 大多数 Web 应用都为用户提供了重置密码的功能。相比强迫你在每个应用中都要重实现一遍此功能,Laravel 提

    • 问题内容: 我一直按照以下说明为Windows 7便携式计算机上的本地安装重置 root 密码。 我停止了服务,创建了 init-file ,并运行以下命令(以管理员身份): 我收到以下 警告 : 2014-02-08 15:44:10 0 [警告]不建议使用带隐含DEFAULT值的TIMESTAMP。请使用– explicit_defaults_for_timestamp服务器选项(有关更多详细

    • 我正在ASP. NET中实现自己的重置密码。在重置密码中,首先我创建一个随机字符串并将其邮寄到用户电子邮件。对于电子邮件中的链接,如http://xyz.com/account/forgot?random=xxxx

    • 问题内容: 我有一个程序从配置文件中读取服务器信息,并希望对该配置中的密码进行加密,该密码可由我的程序读取并解密。 要求: 加密要存储在文件中的纯文本密码 解密从我的程序从文件读取的加密密码 关于我将如何做到这一点的任何建议?我当时在考虑编写自己的算法,但我认为这绝对是不安全的。 问题答案: 一种简单的方法是在Java中使用基于密码的加密。这使你可以使用密码来加密和解密文本。 这基本上意味着初始化

    • 我们已经讲解完了,如果创建,注册用户,激活,修改,删除用户了,看似已经全了,但是我们还缺了一点 那就是为用户提供重置密码! 这个是一个网站必不可少的功能之一吧 我们重置密码,在 sentry 中分成 两步 1、发送 重置代码给用户 2、验证 重置代码,成功则修改密码 首先我们看 第一步 获取重置密码的代码 try { // 根据 email 查找用户 $user = Sentry: