1

如何验证用户身份并将其重定向到他自己的页面,即 www.mysite.com/“用户的电子邮件”。

我正在使用以下不起作用的算法...

用户类中的 userDB:

Map<String,String> userdata=new HashMap<String,String>();

首先我的登录流程表格:

@Path("/login")
    @POST
    @Produces(MediaType.TEXT_HTML)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void login(
            @FormParam("email") String emailc,
            @FormParam("password") String pass,
            @Context HttpServletResponse servletResponse
    ) throws IOException,RuntimeException {
        User u1=new User();
        pass=u1.getPassword();
        emailc=u1.getEmailaddrs();

              boolean checked=false;
        boolean exists;
        exists=u1.userdata.containsKey(emailc);
        if(exists){
            String mypass =u1.userdata.get(emailc);
            if(mypass==pass){
                checked=true;
            }else{
                checked=false;
            }
        }else{
            checked=false;
        }
        if(!checked){
            //User Doesn't exists
            servletResponse.sendRedirect("http://localhost:8080/MySite/pages/Create_Profile.html");
        }else{
            servletResponse.sendRedirect("http://localhost:8080/MySite/{email}");  <<<< How to redirect using @FormParam("email")   
        }
    }  

创建个人资料

@POST
    @Produces(MediaType.TEXT_HTML)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void newUser(
            @FormParam("email") String email,
            @FormParam("password") String password,
            @Context HttpServletResponse servletResponse
    ) throws IOException {
            User u = new User(email,password);
            User.userdata.put(email,password);
    }
4

2 回答 2

2

userdata [Map]对我的使用看起来不对。它是用户类的一部分,是非静态的还是静态的?如果它是非静态的,那么每次你都会这样做new User()......该地图将被初始化并且其中没有数据。因此u1.userdata.containsKey(emailc);将永远是错误的。

如果您将哈希图用作开发目的的临时数据库,请将其设为静态,而不是将其保存在不同的类中,如 UserStore 或某些 DB 访问层。下面的例子:

public class UserDAO(){

private static Map<String,User> userdata = new HashMap<String,User>();
public boolean hasUser(String email){
 return userdata.contains(email);
}

public User saveUser(String email, String password ...){
//make user object save it in map and return the same
}

// more methods for delete and edit etc.

}

并像这样在您的 REST 层类中使用它

exists = userDao.hasUser(email);

好处 :

  1. 你的问题将得到解决。
  2. 稍后当您转向实际的数据库实现时,您只需更改您的 UserDao 代码,其余应用程序代码就可以了。-- 松散耦合:)

也关于使用电子邮件转发

servletResponse.sendRedirect("http://localhost:8080/MySite/{email}");  <<<< How to redirect using @FormParam("email")

仅在 url 中添加 email 参数,如果那是你想要的:

servletResponse.sendRedirect("http://localhost:8080/MySite/"+emailc);

更新 :

看到最根本的是你得到请求参数[email , password]。您检查它是否存在于地图中。现在你在这里做错的是你创建一个这样的新用户User u = new User();,然后从中获取电子邮件和密码emailc = u.getEmail();。这emailc将永远是null,您userdata map将永远为此而回报false。你有两个选择:

  1. 在用户对象中设置电子邮件和密码,然后从用户对象中获取数据。
  2. 使用从请求参数中获得的电子邮件和密码用于您的逻辑。不要改变它们

编程时要遵循的一种好习惯是,始终将您的方法参数视为最终参数。

更新 2:

if(mypass==pass){
                checked=true;
            }else{
                checked=false;
            }

改变==方法equalsString matching应该通过equalsorequalsIgnoreCase方法而不是==来完成。

于 2013-06-18T14:37:26.533 回答
0

User您总是在没有任何参数的情况下创建一个新的: User u1=new User();. 所有这些User实例都将具有相同的属性值,并且可能exists总是false.

于 2013-06-18T11:07:44.253 回答