2010-09-08 11 views
10

Hasta ahora entiendo los conceptos de Httpsession en Java.¿Qué es una sesión en Java?

HttpSession ses = req.getSession(true); 

creará un objeto de sesión, de acuerdo con la solicitud.

setAttribute("String", object); 

habrá, obligar a la 'cadena', y el valor con el objeto Session.

getAttribute("String"); 

devolverá un objeto asociado con la cadena, especificada.

Lo que yo no soy capaz de entender es: Estoy creando un objeto de sesión como HttpSession ses = req.getSession(true); y establecer un nombre para él llamando setAttribute("String", object);. Aquí, este código reside dentro del servidor. Para cada persona, cuando intente iniciar sesión, se ejecutará el mismo código en el servidor. setAttribute("String", object); en este método, el valor de la cadena es constante. Entonces, cada objeto de sesión creado será enlazado por la misma cadena que he proporcionado. Cuando trato de recuperar la cadena para validar su sesión o mientras la acción de cierre de sesión toma el getAttribute("String"); ll devuelvo el mismo valor de cadena constante (¿Estoy en lo cierto? ?? En realidad, no lo sé, solo estoy pensando en su lógica de ejecución) Entonces, ¿cómo puedo ser capaz de invalidar?

Vi este tipo de ilustración en todos los tutoriales en la WEB. ¿Es la forma real de establecer ese atributo? O bien, los desarrolladores de aplicaciones reales se dan una variable en el campo "Cadena" para ajustar de forma dinámica

(ie. session.setAttribut(userName, userName); //Setting the String Dynamically.. I dono is it right or not.)

Y mi última pregunta es

WebContext ctx = WebContextFactory.get(); 
request = ctx.getHttpServletRequest(); 

¿Qué significan las dos líneas anteriores hacen? ¿Qué se almacenará en la solicitud ctx &? HttpSession ses = req.getSession(true); creará nuevos medios de sesión. Qué valor almacenado en ses.

+28

Oh querido, tienes que esperar 10 minutos para la primera respuesta ... :-P –

+1

Una sesión está asociada a un solo usuario. Dos usuarios diferentes tienen una sesión diferente. Si desea compartir algo con el mismo usuario, utilice setAttribute en el objeto de sesión.Si hay más de un uso, utilice el objeto de contexto. También puede compartir objetos adjuntando con un objeto de solicitud. –

Respuesta

14

Algunos [al azar] precisiones:

  1. Usted no necesitan mecanismos de conexión/desconexión con el fin de tener sesiones.
  2. En los servlets de Java, las sesiones HTTP se rastrean utilizando dos mecanismos, la cookie HTTP (la más utilizada) o la reescritura de URL (para admitir navegadores sin cookies o con cookies deshabilitadas). Usar solo cookies es simple, no tienes que hacer nada especial. Para volver a escribir URL, debe modificar todas las URL que apuntan a sus servlets/filtros.
  3. Cada vez que llame al request.getSession(true), se inspeccionará el objeto HttpRequest para encontrar una ID de sesión codificada en una cookie O/AND en el parámetro ruta URL (lo que sigue a un punto y coma). Si no se puede encontrar la ID de la sesión, el contenedor del servlet creará una nueva sesión (es decir, el servidor).
  4. La ID de la sesión se agrega a la respuesta como una Cookie. Si también desea admitir la reescritura de URL, los enlaces en sus documentos HTML deben modificarse utilizando el método response.encodeURL(). Llamar al request.getSession(false) o simplemente al request.getSession() devolverá nulo en caso de que no se encuentre el ID de sesión o el ID de sesión haga referencia a una sesión no válida.
  5. Hay una sola sesión HTTP por visite, ya que las cookies de la sesión de Java no se almacenan de forma permanente en el navegador. Por lo tanto, las sesiones objeto no se comparten entre los clientes. Cada usuario tiene su propia sesión privada.
  6. Las sesiones se destruyen automáticamente si no se utilizan durante un tiempo determinado. El valor de tiempo de espera se puede configurar en el archivo web.xml.
  7. Una sesión determinada se puede invalidar explícitamente mediante el método invalidate().
  8. Cuando las personas hablan de JSESSIONID, se están refiriendo al nombre estándar de la cookie HTTP utilizada para realizar el seguimiento de sesión en Java.
11

Le sugiero que lea un tutorial en las sesiones de Java. Cada usuario obtiene un objeto HttpSession diferente, basado en un parámetro de solicitud/respuesta JSESSIONID que el servidor web Java envía al navegador. Entonces, cada usuario puede tener un atributo con el mismo nombre, y el valor almacenado para este atributo será diferente para todos los usuarios.

Además, WebContextFactory y WebContext son clases DWR que proporcionan una manera fácil de obtener los parámetros de servlet.

+0

No estoy seguro de por qué esto fue downvoted. – Pat

+0

Sí, lo sé. Pero no puedo entender qué se almacenará en esa variable 'ctx' y 'request'. Eso es lo que pregunté allí. ¿Qué es WebContextFactory y WebContext? ¿Qué harán ellos? –

+2

¿Has echado un vistazo a los javadocs para esas clases? HttpServletRequest: http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html, WebContextFactory: http://www.jarvana.com/jarvana/view/org/directwebremoting/dwr/ 2.0.3/dwr-2.0.3-javadoc.jar! /org/directwebremoting/WebContextFactory.html, y WebContext: http://www.jarvana.com/jarvana/view/org/directwebremoting/dwr/2.0.3/ dwr-2.0.3-javadoc.jar! /org/directwebremoting/WebContext.html –

8

Según tengo entendido, sus preocupaciones se refieren a la separación de los diferentes usuarios al almacenar cosas en la HttpSession.

El contenedor de servlet (por ejemplo Tomcat) se encarga de esto utilizando su JSESSIONID.

La historia es la siguiente: primeros registros

  1. de usuario en el sitio web.
  2. El contenedor del servlet establece un COOKIE en el navegador del usuario, que almacena UNIs jsessionId.
  3. Cada vez que el usuario visita el sitio web , la cookie JSESSIONID es devuelta.
  4. El contenedor de servlets usa esto para realizar un seguimiento de quién es quién.
  5. Del mismo modo, así es como se realiza el seguimiento de la separación de datos. Cada usuario de tiene su propia categoría de objetos identificados de forma única por el JSESSIONID.

Espero que (al menos parcialmente) responda a su pregunta.

Saludos

+0

Sí, ha respondido la mitad de mi pregunta. Lo que tengo que hacer es invalidar una sesión (es decir, ¿cómo debo eliminar el objeto de sesión para una persona en particular, que hace clic en Cerrar sesión)? –

+0

Creo que session.invalidate() cancela la sesión, por lo que cuando el usuario vuelva a visitar el sitio, el proceso comenzará de nuevo. – lucas1000001

+0

Tenga en cuenta que el objeto de sesión no es un singleton compartido por todos los usuarios: ¡cada usuario tiene su propio objeto! – lucas1000001

3

Su servlet básico se va a ver como

public class MyServlet{ 

public doGet(HttpServletRequest req, HttpServletResponse res){ 
//Parameter true: 
// create session if one does not exist. session should never be null 
//Parameter false: 
// return null if there is no session, used on pages where you want to 
// force a user to already have a session or be logged in 
//only need to use one of the two getSession() options here. 
//Just showing both for this test 
HttpSession sess = req.getSession(true); 
HttpSession sess2 = req.getSession(false); 

//set an Attribute in the request. This can be used to pass new values 
//to a forward or to a JSP 
req.setAttribute("myVar", "Hello World"); 
} 

} 

No hay necesidad de establecer ningún nombre de atributo para la sesión que ya está hecho. Como otros han sugerido en otras respuestas, use cookies o reescriba URL para almacenar el sessionID por usted.

Cuando se trata de la DWR WebContext, que es simplemente hacer lo mismo que arriba, solo que normalmente el objeto Request no se pasa en el método, por lo que utilizar el WebContext para conseguir que la solicitud de que

public class DWRClass { 
public doSomething(){ 
WebContext ctx = WebContextFactory.get(); 
HttpServletRequest req = ctx.getHttpServletRequest(); 
HttpSession sess = req.getSession(); //no parameter is the same as passing true 

//Lets set another attribute for a forward or JSP to use 
ArrayList<Boolean> flags = new ArrayList<Boolean>(); 
req.setAttribute("listOfNames", flags); 
} 
}