如何在Jersey REST服务中对用户进行身份验证并将其重定向到“自己的”页面

时间:2013-06-18 09:30:36

标签: rest java-ee tomcat jersey

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

我正在使用以下不能正常工作的算法......

用户类中的

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

createprofile

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

2 个答案:

答案 0 :(得分:2)

您对userdata [Map]的使用对我来说是错误的。它是用户类的一部分,是非静态还是静态? 如果它是非静态的,则每次执行new User()时,该地图将被初始化,并且其中没有数据。因此u1.userdata.containsKey(emailc);将始终为假。

如果您正在将hashmap用作开发目的的临时数据库,那么请将其设置为静态,而不是将其保存在其他类(如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代码,其余的应用程序代码就可以了。 - 松耦合:))
  3. 关于使用电子邮件转发

    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. 使用从请求参数获取的电子邮件和密码作为您的逻辑。不要改变它们
    3. 编程时遵循的一个好习惯是始终将方法参数视为最终参数。

      更新2:

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

      ==更改为equals方法。 String matching应该由equalsequalsIgnoreCase方法而不是==来完成。

答案 1 :(得分:0)

您始终创建一个没有任何参数的新UserUser u1=new User();。所有这些User个实例都具有相同的属性值,exists可能始终为false