一尘不染

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

tomcat

如何对用户进行身份验证并将其重定向到他自己的页面,即到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")   
        }
    }

创建个人资料

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

阅读 259

收藏
2020-06-16

共1个答案

一尘不染

userdata [Map]对我的用法看起来不对。它是用户类的一部分,是非静态还是静态的?如果它是非静态的,那么每次您将执行new User()该映射时,该映射将被初始化,并且其中将没有数据。因此u1.userdata.containsKey(emailc);将永远是错误的。

如果您出于开发目的将哈希图用作临时数据库,则使其为静态,而不是将其保留在其他类(如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")

如果您想要的是,仅在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;
            }

更改==equals方法。String matching应该由equalsequalsIgnoreCase方法而非==完成。

2020-06-16