如何在 Jersey 中使用这种身份验证机制
How to approach this authentication mechanism in Jersey
我是 Jersey REST Framework 的新手,如果这是一个愚蠢的问题,请原谅。
我正在使用 Tomcat 与 Hibernate 和 Jersey REST Web 服务。
我的 Web APP 中有一组 HTML 个页面
login.html
dealer.html
sales.html
除了 login.html
之外,我不希望用户直接访问 HTML 页面
因此,要解决此问题,请在按下提交后,在 login.html 下调用
对后端进行以下调用
@Path("/webchecklogin")
public class WebLoginCheck {
@Context
private HttpServletResponse response;
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces("application/json")
public String getData(LoginInfo loginInfo ) throws JSONException,ClassNotFoundException, SQLException
{
String ID = loginInfo.getID();
String email = loginInfo.getEmail();
// validate this values with Database and if successfully logged in , stored them in session AND cookies also
}
}
在 dealer.html 和 sales.html 中,在页面准备就绪时我正在调用如下所示的服务
var checkcallajax = $.ajax({
type: 'GET',
url: url + '/ORIENT/orn/checkifuserloggedin',
jsonpCallback: 'jsonCallback',
success: function(response) {
}
})
@Path("/checkifuserloggedin")
public class CheckIfUserLoggedIn {
@Context
private HttpServletRequest request;
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces("application/json")
public String checkIfUserLoggedIn() throws JSONException,ClassNotFoundException, SQLException
{
// On what basis , should i check wheher the USER is logged or NOT
// I tried storing data with Session and cookies , but i am unable to retrive them here
//return true or false
// based on true or false , i am redireting user to appropiate page
}
}
谁能告诉我如何处理这个问题
RestFUL Web 服务应该是无状态的,所以理论上,您可以在每个请求中发送凭据,并且从 "server point of view"
大多数人会发现这很麻烦,占用大量资源,并且从安全角度来看,在客户端上存储凭据有些不好。
另一种方法可能是您的登录方法 returns 一个令牌,每个请求都需要 re-sent(可能在 header 中)到服务器。
客户端必须知道如何存储它(session cookie?在域上
服务 html,如果您处于 CORS 场景中)
服务器必须知道如何验证令牌。
最重要的是,令牌的验证可以在 JaxRS 过滤器中完成...在到达您的服务入口点之前。更好的是,此过滤器可以将角色添加到请求上下文中,因此您可以在您的服务中使用 @RolesAllowed 注释。
我"very personnally"避免依赖javax.servlet.Session,因为这基本上是有状态的。但是,假设客户端将 jSessionId(其他其他 cookie 名称)存储在 session cookie 中,您应该能够做到这一点。如果它不起作用,您可能有 CORS 或其他域特定问题,阻止客户端自动存储和返回此 cookie。
希望对您有所帮助。
我是 Jersey REST Framework 的新手,如果这是一个愚蠢的问题,请原谅。
我正在使用 Tomcat 与 Hibernate 和 Jersey REST Web 服务。
我的 Web APP 中有一组 HTML 个页面
login.html
dealer.html
sales.html
除了 login.html
之外,我不希望用户直接访问 HTML 页面因此,要解决此问题,请在按下提交后,在 login.html 下调用
对后端进行以下调用
@Path("/webchecklogin")
public class WebLoginCheck {
@Context
private HttpServletResponse response;
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces("application/json")
public String getData(LoginInfo loginInfo ) throws JSONException,ClassNotFoundException, SQLException
{
String ID = loginInfo.getID();
String email = loginInfo.getEmail();
// validate this values with Database and if successfully logged in , stored them in session AND cookies also
}
}
在 dealer.html 和 sales.html 中,在页面准备就绪时我正在调用如下所示的服务
var checkcallajax = $.ajax({
type: 'GET',
url: url + '/ORIENT/orn/checkifuserloggedin',
jsonpCallback: 'jsonCallback',
success: function(response) {
}
})
@Path("/checkifuserloggedin")
public class CheckIfUserLoggedIn {
@Context
private HttpServletRequest request;
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces("application/json")
public String checkIfUserLoggedIn() throws JSONException,ClassNotFoundException, SQLException
{
// On what basis , should i check wheher the USER is logged or NOT
// I tried storing data with Session and cookies , but i am unable to retrive them here
//return true or false
// based on true or false , i am redireting user to appropiate page
}
}
谁能告诉我如何处理这个问题
RestFUL Web 服务应该是无状态的,所以理论上,您可以在每个请求中发送凭据,并且从 "server point of view"
大多数人会发现这很麻烦,占用大量资源,并且从安全角度来看,在客户端上存储凭据有些不好。
另一种方法可能是您的登录方法 returns 一个令牌,每个请求都需要 re-sent(可能在 header 中)到服务器。
客户端必须知道如何存储它(session cookie?在域上 服务 html,如果您处于 CORS 场景中)
服务器必须知道如何验证令牌。
最重要的是,令牌的验证可以在 JaxRS 过滤器中完成...在到达您的服务入口点之前。更好的是,此过滤器可以将角色添加到请求上下文中,因此您可以在您的服务中使用 @RolesAllowed 注释。
我"very personnally"避免依赖javax.servlet.Session,因为这基本上是有状态的。但是,假设客户端将 jSessionId(其他其他 cookie 名称)存储在 session cookie 中,您应该能够做到这一点。如果它不起作用,您可能有 CORS 或其他域特定问题,阻止客户端自动存储和返回此 cookie。
希望对您有所帮助。