如何使用 jersey 2.19 REST API 管理 client/server 会话数据

How to manage client/server session data using jersey 2.19 REST API

我是 REST 的新手,正在尝试解决让用户访问 REST API 数据的问题

我有一个应用程序,其中用户根据其用户 ID 对他们可以看到的内容拥有有限的权限。 我通过类似于下面的方法来做到这一点:

    @Component
    public class StudentsResource{

        @Path("students")
        @GET
        @Produces(MediaType.APPLICATION_JSON_VALUE)
        public Students getStudents(@Context HttpServletRequest request){
            final HttpSession session = request.getSession();
            User user = (User) session.getAttribute(RestConstants.USER);

            if(user == null){
                throw new NotLoggedInException(RestConstants.USER_NOT_LOGGED_IN);
            }
            Students students = new Students();

            return students;
        }
    }

如果我登录到应用程序,然后将 REST URL 的 URL 粘贴到浏览器 localhost:8080/api/students 我得到 JSON 响应 /students.如果我没有先登录到应用程序,而只是在浏览器中导航到 URL localhost:8080/api/students,我会收到错误消息,指出我没有被授权,因为我没有登录到应用程序。 (这样就可以如我所愿了)

但是,如果我在使用 client 代码调用 API 的应用程序中构建网页,按下按钮将 运行:

    String restURL = "http://localhost:8080/localhost:8080/api/students";
    final RestTemplate rest = new RestTemplate();
    Students response = rest.getForObject(restURL,Students.class);

然后我登录到应用程序,并通过按下按钮 运行 上面的代码(而不是仅仅导航到浏览器中的 URL),我得到一个错误,我不是已登录,所以我没有权限查看数据。

经过进一步调查,我发现这是因为我在 server 端代码中获得的会话在按下client 端,但在浏览器中导航到 URL 时它具有正确的 user

为什么当我登录时使用 client 代码时这个值是 null,但它通过导航到 URL?

如何在使用 Client code/button 时获取正确的 Session 数据以登录 user

您可以通过基于token的认证机制实现client/server通信,基本上您所做的就是在用户登录我们的系统后,我们生成一个随机的UUid并将其与userid连接,使用Base64算法对其进行编码并发送它作为令牌返回给客户,


然后从下一个请求开始,用户需要在 header 中发送令牌,形成 header 我们可以识别哪个用户正在访问该服务。

查看下面的 link 了解更多信息,这是一个关于 Jax-Rs 的所有详细信息的好博客
https://abhirockzz.wordpress.com/