如何验证和用户重定向到泽西岛REST服务他自己的页面(How to authenticate and

2019-10-18 07:07发布

如何验证和用户重定向到自己的页面即www.mysite.com/"user's电子邮件”。

我使用下面的算法中这是不工作...

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);
    }

Answer 1:

您的使用userdata [Map]看来我错了。 它是用户类的一部分,它是静态的非或静态? 如果它是非静态的,则每次都会做new User() ..这地图将被初始化,它将在它没有数据。 因此u1.userdata.containsKey(emailc); 将始终为false。

如果您正在使用一个HashMap为开发目的的临时数据库,然后,使其静态,而把它放在一个不同的类象UserStore或某些数据库访问层。 〔实施例如下:

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")

添加电子邮件参数存在的网址,而如果这是你想要的东西:

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;
            }

更改==equals方法。 String matching应该做equalsequalsIgnoreCase方法不是==。



Answer 2:

你总是创建一个新的User不带任何参数: User u1=new User(); 。 所有这些User实例将具有相同的属性值,并可能exists始终是false



文章来源: How to authenticate and redirect a user to his 'own' page in Jersey REST service