黑马程序员_Java Web 中Session机制的学习

-----------------------------android培训java培训期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------



 

1.    Web服务器跟踪客户状态通常有四种方法

– 建立含有跟踪数据的隐藏字段

– 重写包含额外参数的URL

– 使用持续的Cookie

– 使用ServletAPI中的Session(会话)机制

2.    Session: Session用于跟踪客户的状态。Session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。在一个Session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。

例1:在电子邮件应用中,从一个客户登录到电子邮件系统开始,经过收信、写信和发信等一系列操作,直至最后退出邮件系统,整个过程为一个Session。

例2:在购物网站应用中,从一个客户开始购物,到最后结账,整个过程为一个Session。

3.    Session运行机制:

当一个 Session Servlet HttpSession对象,在HttpSession对象中可以存放客户状态的信息(例如购物车)。

• Servlet容器为HttpSession分配一个惟一标志符,称为Session  IDServlet容器把Session  ID作为Cookie保存在客户的浏览器中。

每次客户发出 HTTP请求时 Servlet容器可以从HttpServletRequest对象中读取Session  ID,然后根据Session  ID找到相应的HttpSession对象,从而获取客户的状态信息。 

 

4.    HttpSession接口:

• getId()

   返回Session的ID

 • invalidate()使当前的Session失效,Servlet容器会释放HttpSession对象占用的资源

• setAttribuate(String name, Object value) 将一对name/value属性保存在HttpSession对象中

      •getAttribute(String name) 根据name参数返回保存在HttpSession对象中的属性值

       • isNew()判断是否是新创建的Session。如果是新创建的Session,返回true,否则返回false

•setMaxInactiveInterval()设定一个Session可以处于不活动状态的最大时间间隔,以秒为单位。如果超过这个时间,Session自动失效。如果设置为负数,表示不限制Session处于不活动状态的时间

 

5.    •当客户第一次访问Web应用中支持Session的某个网页时,就会开始一个新的Session。 // 也有不支持Session的网页,当在JSP中配置:

<%@ page session=”false” >

•接下来当客户浏览这个Web应用的不同网页时,始终处于同一个Session中。

•默认情况下,JSP网页都是支持Session的,也可以通过以下语句显式声明支持Session:<%@page session= "true">

6.    在以下情况中,Session将结束生命周期,Servlet容器会将Session所占用的资源释放掉:

–客户端关闭浏览器(真的这样吗?)

–Session过期

–服务器端调用了HttpSession的invalidate()方法

 

7.    重定向:是客户端再次向服务器发送一次请求,就不能使用request.getAttribute()方法.

 

使用请求转发实现:

req.setAttribute("username",username);

                            req.setAttribute("password",password);

                        req.setAttribute("authority",authority);

 

RequestDispatcherrd=

req.getRequestDispatcher("session/login.jsp");

                       rd.forward(req,resp);

 

使用重定向实现:

resp.sendRedirect("session/login.jsp?username="+ username + "&authority=" + authority);//sendRedirect()方法里放入JSP页面.

     

Servlet过滤器的学习

 

1.    Servlet过滤器:

• Servlet过滤器能够对Servlet容器的请求和响应对象进行检查和修改。

 

• Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。

 

• Servlet过滤器能够在Servlet被调用之前检查Request对象,修改RequestHeader和Request内容;

 

• 在Servlet被调用之后检查Response对象,修改ResponseHeader和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。 

2.    Filter接口:

•所有的Servlet 过滤 器 类javax.servlet.Filter接口。这个接口含3个过滤器类必须实现的方法

–init()

init(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数

 

–doFilter()

doFilter(ServletRequest,ServletResponse,FilterChain):

 这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器

 

       – destroy()

       destroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源 

 

例如:

//获得username请求参数,进行字符编码转换

 

Stringusername =

     ((HttpServletRequest)request).getParameter("username");

if(username!=null )

     username= new  String(username.getBytes("ISO-8859-

1"),"GB2312");

 

如果客户名不在黑名单里,NoteFilterdoFilter方法就会调用chain.doFilter()方法,这个方法用于调用过滤器链中后续过滤器的doFilter()方法。假如没有后续过滤器,那么就把客户请求传给相应的Web组件。

 

• 发布Servlet过滤器时,必须在web.xml文件中加入<filter>元素和<filter-mapping>元素。<filter>元素用来定义一个过滤器:

   <filter> 

   <filter-name>NoteFilter</filter-name> 

    <filter-class>NoteFilter</filter-class> 

  <init-param>

         <param-name>blacklist</param-name>

           <param-value>捣蛋鬼</param-value>

   </init-param>

 </filter>

 

 

doFilter()方法中页面的过滤:

 

HttpServletRequestr = (HttpServletRequest) request;

              String requestURI = r.getRequestURI();

              if(requestURI.endsWith("login.jsp")

                            ||requestURI.endsWith("MyLoginServlet"))

              {

                     chain.doFilter(request,response);

                     return;

              }

 

 

问题:下面哪些说法是正确的?

选项:

– (A) 对于每个要求访问maillogin.jsp的HTTP请求,Servlet

容器都会创建一个HttpSession对象   //1 必须支持Session  2. 对同一个用户请求只创建一个Session.

– (B)每个HttpSession对象都有惟一的ID。

– (C)JavaWeb应用程序必须负责为HttpSession分配惟一的

ID   //是由Session容器创建,并不是JavaWeb应用创建.

 

• 问题:在Servlet过滤器中能否访问application范围内的

共享数据?

• 答案:可以的,在Filter中的init()方法中,先调用FilterConfig的getServletContext()方法获得ServletContext,再调用ServletContext的getAttribute()方法来获得application范围内的共享数据。

--然后在web.xml中的<filter>配置:

<filter>

            <filter-name>CommentFilter</filter-name>

            <filter-class>com.shengsiyuan.filter.CommentFilter</filter-class>

            <init-param>

                   <param-name>hello</param-name>

                   <param-value>world</param-value>

            </init-param>

            <init-param>

                   <param-name>zhang</param-name>

                   <param-value>li</param-value>

            </init-param>

   </filter>



1.    Listener:

•Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。

•当增加一个HttpSession时,就激发sessionCreated(HttpSessionEventse)方法,这样就可以给在线人数加1 

 

•常用的监听接口有以下几个 

ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性 

ServletContextListener监听ServletContext。当创建ServletContext时

,激发contextInitialized(ServletContextEventsce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEventsce)方法.

-HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发sessionCreated(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法 

-HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEventse) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEventse)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEventse) 方法 

 

2.    ExpressionLanguage 表达式语言:用在JSP中,

 

       ${ param.username }

等同于Java代码:

              <%= request.getParameter(“username”)%>

 

   ${sessionScope.hello }

等同于Java代码:

       <%=session.getAttribute(“hello”)>

 

${sessionScope.user.sex}

等同于Java代码:

User user =(User)session.getAttribute("user");

String sex =user.getSex( );

 

3.    JSP中有9个默认对象,EL中的默认对象有:

名称:                                                       属性范围:

pageContext                            

pageScope                                      Page

requestScope                                  Request

sessionScope                         Session

applicationScope                       Application

param

 

paramValues

header

headerValues

cookie

 

• 我们也可以指定要取出哪一个范围的变

${page.Scope.username}  取出Page范围的username变量,

${request.Scope.username}  取出Request范围的username变量,

 

• (1) 当要存取的属性名称中包含一些特殊字符,如. 或– 等并非字母或数字的符号,就一定要使用[ ],例如:

•${user.My-Name }

• 上述是不正确的方式,应当改为:

•${user["My-Name"] }

 

• 我们来考虑下列情况:${sessionScope.user[data]}

• 此时,data是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex};

假若data的值为"name"时,它就等于${sessionScope.user.name}。因此,

如果要动态取值时,就可以用上述的方法来做,但 .无法做到动态取值

 

• EL 存取变量数据的方法很简单,例如${username}。它的意思是取出某一范围中名称为username的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page范围找,假如找不到,再依序到Request、Session、

Application范围。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null












-----------------------------android培训java培训期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值