gestión de sesiones con aplicación web respaldada por Spring ws

Estoy tratando de crear una aplicación web, que utilizará una interfaz js e invocará Spring WS en el backend. Digamos que este es un tipo de sitio web de compras. Entonces, podría tener servicios como OrderService InventoryService ShippingServicey así sucesivamente. Lo único que necesita sesión es el carrito de compras del usuario. Ahora, solo para este carrito de compras, ¿tiene sentido usar un contenedor de servlet para la gestión de sesiones? ¿O debería tener CartServiceesa información de sesión persistente en la base de datos?

¿Cuál es la mejor práctica cuando se trata de la gestión de sesiones con WebServices? Supongo que la mejor práctica es mantener el servicio sin estado, pero ¿cómo puedo autorizar a los usuarios si tengo servicios web sin estado?

¿Es una buena práctica usar un contenedor de servlet solo para administrar la sesión y luego tener diferentes controladores que actúen como representantes de los servicios web?

Adjunto una imagen para que comprenda mejor el contexto. ingrese la descripción de la imagen aquí

Respuesta 1

Si el servicio web no tiene estado, ¿cómo sé que una solicitud ajax está autorizada? ¿Cómo sé que la solicitud ajax proviene del usuario1 de webapp1, que está autorizado? y no del usuario2 de webapp2, ¿quién no está autorizado para acceder al servicio?

Buena pregunta. La respuesta rápida sería:

  1. Para la autenticación básica : nombre de usuario: la contraseña está codificada en base64 y se almacena en el encabezado http de autorización para cada solicitud que envía el cliente. Ver esta entrada de wiki . El encabezado se ve así:

    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

    Con la seguridad de primavera , la configuración puede ser así:

    <http pattern="/api/**" create-session="stateless">
        <intercept-url pattern='/**' access="hasRole('REMOTE')" />
        <http-basic />
    </http>
  1. Para la forma de autenticación basado de WS, echar un vistazo a este artículo .

    • Primero envió una solicitud de publicación a / j_spring_security_check . Esta solicitud devolverá la cookie que luego será utilizada por cualquier solicitud posterior contra el servicio web. Aquí lo almacenan en un archivo de texto:

      curl -i -X POST -d j_username=user -d j_password=userPass -c /tmp/cookies.txt http://localhost:8080/app/j_spring_security_check

    • Luego puede usar la cookie del archivo para realizar más solicitudes autenticadas:

      curl -i --header "Accept:application/json" -X GET -b /tmp/cookies.txt http://localhost:8080/app/api/foos

    La configuración de seguridad de Spring XML puede verse así:

    <http pattern="/api/**" create-session="stateless">
        <intercept-url pattern='/**' access="hasRole('REMOTE')" />
        <form-login />
    </http>
Respuesta: 2

¿Cómo puedo autorizar a los usuarios si tengo servicios web sin estado?

  1. Si su aplicación usa ws externos, aquí se describe un enfoque bastante común .

  2. Si todos los ws son parte de su entrega, seguramente puede usar spring-security .

  3. Un enfoque muy común también es tener un servidor http (apache) como proxy con algo como ldap para autenticación y autorización.

¿Es una buena práctica usar un contenedor de servlet solo para administrar la sesión y luego tener diferentes controladores que actúen como representantes de los servicios web?

Yo diría que no lo es. Como también se discutió aquí, solo puede beneficiarse al mantener sus Servicios web sin estado y, si necesita mantener el estado entre solicitudes, use cookies.

Si el estado (carrito) debe sobrevivir al cierre de sesión, algo como CartService me parece una buena idea.

Respuesta: 3

Para este sencillo programa ... import java.lang.String; prueba de clase pública {public static void main (String [] argv) {String s = "Hello <BSLASH>"; Cadena sReplaced = s ....

Al convertir la imagen usando UploadedFile uf; // como un paremeter en function; Objeto PrimeFaces; BufferedImage old = ImageIO.read (uf.getInputstream ()); ByteArrayOutputStream temp = nuevo ...

Quería usar la implementación de apache math commons para FFT (clase FastFourierTransformer) para procesar algunos datos ficticios cuyas 8 muestras de datos contribuyen a una onda sinusoidal completa. El maximo ...

Mientras jugaba con cargadores de clases, recibí la siguiente excepción: Excepción en el hilo "main" java.lang.ClassCastException: xxx.Singleton no se puede convertir a xxx.Singleton ¿Esto significa que una instancia ...