2011-10-10 16 views
9

Soy nuevo en los servicios web RESTful y RESTlet. Solo tenemos experiencia en la creación de aplicaciones web basadas en servlets (Servlet/JSP en JBoss/Apache). Ahora, estamos construyendo una aplicación basada en RESTlet en la que la API del lado del servidor sería utilizada por dos tipos de clientes: la web que usa el navegador y la basada en el swing a través del escritorio.¿Cómo imponer 'sesiones' en servicios web RESTful utilizando RESTlet?

Lo que entiendo es que a medida por RESTO conceptos a) del servidor no puede mantener sesiones para mejorar la escalabilidad y algunas otras razones b) cada solicitud de cliente debe ser auto-contenida

Ahora, estoy realmente confundido cómo lograr esto. Supongamos que tomamos una simple aplicación de carrito de compras.

Paso 1) El cliente envía la solicitud de autenticación, el servidor se autentica y el servidor responde OK.

Paso 2) El cliente envía una solicitud para agregar un artículo al carrito de la compra. El servidor responde OK.

Paso 3) El cliente envía otra solicitud para agregar el segundo elemento a la tarjeta de compra. El servidor responde OK.

Normalmente, en una aplicación web normal, se crea una sesión en el Paso 1 en el servidor y desde ese momento todas las solicitudes relacionadas con ese cliente se asocian automáticamente con la misma sesión y almacenamos el estado de la sesión (Carrito de compra en este caso) en el objeto de sesión y recuperarlo/actualizarlo con las solicitudes posteriores del cliente.

Ahora, en el escenario anterior:

1) ¿cómo autenticar y autorizar cliente en el paso 2 y 3 si no hay una sesión mantenida en el servidor?

2) ¿El cliente necesita enviar información adicional con cada solicitud?

3) ¿Cómo recuperamos el Carrito de compras específico del cliente en el Paso 3?

4) ¿El cliente necesita enviar su Carrito de Compras que fue creado/devuelto por el servidor en el Paso 2 nuevamente en el Paso 3?

Obviamente, este es el caso de uso más simple, por lo que cada uno que desarrolle servicios web RESTful debe diseñar su aplicación para manejar esto. ¿Cuál es la mejor y más común forma de manejar la gestión de sesiones, la autenticación y la autorización en servicios web RESTful utilizando RESTLet? Si tenemos que mantener el caché en el lado del servidor con los datos del cliente, ¿cómo es esto diferente del servidor que mantiene las sesiones en nuestro nombre?

Gracias de antemano, profundo

Respuesta

15

1) ¿cómo autenticar y autorizar cliente en el paso 2 y 3 si no hay ninguna sesión mantenida en el servidor?

2) ¿el cliente necesita enviar información adicional con cada solicitud ?

Sí. Debe enviar datos de autenticación/autorización con cada solicitud. Eso es lo que evitará que el servidor "recuerde" quién es usted (es decir, servidor sin estado, sin sesiones)

3) ¿Cómo recuperamos el Carrito de compras específico del cliente en el Paso 3?

Formulemos otra pregunta: ¿Qué ocurre si el servidor se reinicia? ¿Desea que se pierdan todos los datos del carrito de compras? Probablemente no. Implicando que tienes que almacenarlo en algún lugar que pueda sobrevivir a un reinicio. Implicando almacenamiento persistente. Podría ser en el servidor o cliente ...

... ahora, ¿y si se reinicia el cliente? Puede optar por crear un 'recurso' de carrito de compras para ese usuario utilizando una solicitud POST (cuando el usuario agrega el primer elemento) o hacer que se cree en el momento en que el cliente inicia sesión (derrochador). A continuación, continúe actualizando el carrito de la compra utilizando PUT/DELETE y recójalo mediante GET.

Debería ser en la base de datos? Podría ser, depende si así es como quieres que sea. Si tiene que ser persistente, es un buen lugar para guardarlo y poder sobrevivir a un reinicio.

Entonces, ¿cómo reciben cliente específico carrito de la compra? ¡Bueno, solo envía una solicitud GET para el recurso! ¡Eso es! El primer POST creará un recurso en una URL apropiada y luego podrá usarlo.

servicios web RESTful también tienen URL de descanso así que eso es una parte clave del diseño.

4) ¿El cliente necesita enviar su Carrito de Compras que fue creado/devuelto por el servidor en el Paso 2 nuevamente en el Paso 3?

No. Como se mencionó anteriormente. Pero si está utilizando cookies o LocalStorage o alguna otra información del lado del cliente, entonces tal vez lo haga.

Obviamente, este es el caso más sencillo su uso y lo que cada uno desarrollar servicios web RESTful debe diseñar su aplicación para manejar esto. Lo es la mejor y más común forma de manejar la gestión de sesiones, autenticación, autorización de servicios web RESTful usando Restlet?

Sí. Es simple, pero lleva un tiempo pensar en términos de "recursos" en lugar de "servicios". En un diseño tranquilo, todo es (o puede ser) un recurso, incluidas transacciones, carritos de compras, etc.,

Sin embargo, la autorización/autenticación es parte del paquete de solicitud http y se envía con cada solicitud. Sugiero que leas sobre eso.

Si tenemos que mantener la memoria caché en el lado del servidor con los datos del cliente entonces, ¿cómo es esto diferente de servidor de mantenimiento de sesiones sobre nuestra nombre?

BIG difference! ¿Estás almacenando en caché el rendimiento o el mantenimiento de una sesión? Si el sistema se reinicia, ¿funcionará su sistema sin problemas en un caché vacío? Si es así, está almacenando en caché el rendimiento, de lo contrario mantendrá el estado.

Sugiero que lea RESTful Web Services por Richardson & Ruby edifique los conceptos anteriores y obtenga más información sobre cómo se diseñan los servicios de descanso ... toma algo de tiempo acostumbrarse.

+0

pero ¿por qué es malo si el servidor recuerda quién es usted (y solo eso). Si no se adhiere a la especificación REST de forma dogmática, puede comprometerse y evitar la presentación de la autenticación en cada solicitud. – amphibient

+0

¿Puede su diseño sobrevivir a un reinicio? Además, siempre hay algún control para asegurarse de que sea la misma persona y no una sesión robada. – PhD

Cuestiones relacionadas