JavaWeb学习总结——JavaWEB_Session(尚硅谷_佟刚老师)(

HttpSession简介及Session验证码的实现

1. HttpSession 的生命周期

1)什么时候创建HttpSession对象

①对于JSP:是否浏览器访问服务器的任何一个JSP,服务器都会立即创建一个HttpSession对象呢?

不一定

Ø  若当前的JSP访问的第一个资源,且page指定的session属性值为false,则不创建

Ø  若不是第一个,但是其他页面已经创建一个HttpSession对象,也不会就创建新的,用以前的

②对于Servlet:若Servlet是客户端访问的第一个WEB应用资源,则指有调用了requestgetSession()或request.getSession(true)才会创建HttpSession对象

2page中的Session=-false”到底表时什么意思?

Ø  当前JSP页面禁用Session隐含变量!但可以使用其他的显示的HttpSession对象

Ø  Servlet中可以通过以下 API 获取 Session 对象

request.getSession(flag):

flag true, 则一定会返回一个HttpSession 对象, 如果已经有和当前 JSP 页面关联的 HttpSession对象, 直接返回; 如果没有, 则创建一个新的返回.

flag false: 若有关联的, 则返回; 若没有, 则返回 null

request.getSession():相当于 request.getSession(true);

3). 创建一个 Session 对象: page 指定的 session 设置为 false Servlet 中可以通过以下 API 获取 Session 对象.

request.getSession(flag): flag true, 则一定会返回一个HttpSession 对象, 如果已经有和当前 JSP 页面关联的 HttpSession

对象, 直接返回; 如果没有, 则创建一个新的返回.flag false: 若有关联的, 则返回; 若没有, 则返回 null

request.getSession():相当于 request.getSession(true);

HttpSession session = request.getSession();

out.print(session.getId());

session.invalidate();

每次不一样

4). Session 对象的销毁:

. 直接调用 HttpSession invalidate()

.HttpSession 超过过期时间.

      > 返回最大时效:getMaxInactiveInterval() 单位是秒

      > 设置最大时效:setMaxInactiveInterval(int interval)

        可以在 web.xml 文件中配置 Session 的最大时效, 单位是分钟.

<session-config>

        <session-timeout>30</session-timeout>

    </session-config>

. 卸载当前 WEB 应用.

注意: 关闭浏览器不会销毁 Session!

重新登录和注销方法实现

Login.jsp

    <%

       Object username = session.getAttribute("username");

       if(username==null){

           username="";

       }

    %>

    <form action="hello.jsp" method="post">

       username:<input type="text" name="username" value="<%=username%>"/>

       <input type="submit" value="Submit"/>

    </form>

Hello.jsp

Hello:<%=request.getParameter("username") %>

   

    <%--重新登录有两种方式

    <a hr ef="Zhuxiao.jsp?username=<%=request.getParameter("username") %>">重新登录</a>

    --%>

    <!-- session 可以跨页面-->

    <%

       session.setAttribute("username", request.getParameter("username"));

    %>

    <a href="login.jsp">重新登录</a>

    &nbsp;&nbsp;&nbsp;&nbsp;

    <a href="logout.jsp">注销</a>

Logout.jsp

    Bye:<%=session.getAttribute("username") %>

    <br><br>

   

    <a href="login.jsp">重新登录</a>

    <%

       session.invalidate();

    %>

注:页面组织cookie时的重新登录方法——URL重写

       <a href=response.encodeURL("login.jsp")>重新登录</a>

或者       <a href=response.encodeRedirectURL("login.jsp")>重新登录</a>

2. / 什么时候代表站点的根目录, 什么时候代表当前 WEB 应用的根目录

1)当前WEB应用的根路径:http://localhost:8080/contextPath

/ 交由Servlet容器来处理

其中的ContextPath可由requestapplicationgetContextPath方法来获取

Ø  请求转发request.getRequestDispatcher(“/path/b.jsp”).forward(request,response);

Ø  Web.xml中的<selrvlet-mapping>

Ø  各种定制标签中的/

2WEB站点的根路径:http://localhost:8080/

交由浏览器来处理

Ø  超链接<a href=”/TestServlet”>TO B Page</a>

Ø  表单中的action<form action=”/login.jsp”>

Ø  请求重定向:response.sendRedirect(“/a.jsp”)

3. 表单的重复提交

1). 重复提交的情况:

. 在表单提交到一个 Servlet, Servlet 又通过请求转发的方式响应一个JSP(HTML) 页面,

此时地址栏还保留着 Serlvet 的那个路径, 在响应页面点击 "刷新"

. 在响应页面没有到达时重复点击 "提交按钮".

. 点击 "返回", 再点击 "提交"

2). 不是重复提交的情况: 点击 "返回", "刷新" 原表单页面, "提交"

3). 如何避免表单的重复提交: 在表单中做一个标记, 提交到 Servlet , 检查标记是否存在且是否和预定义的标记一致, 若一致, 则受理请求,并销毁标记, 若不一致或没有标记, 则直接响应提示信息: "重复提交"

. 仅提供一个隐藏域: <inputtype="hidden" name="token" value="atguigu"/>. 行不通: 没有方法清除固定的请求参数.

. 把标记放在 request . 行不通, 因为表单页面刷新后, request已经被销毁, 再提交表单是一个新的 request.

. 把标记放在 session . 可以!

      > 在原表单页面, 生成一个随机值 token

      > 在原表单页面, token 值放入session 属性中

      > 在原表单页面, token 值放入到隐藏域.

 

      > 在目标的 Servlet : 获取 session 隐藏域中的 token

      > 比较两个值是否一致: 若一致, 受理请求, 且把 session 域中的 token 属性清除

      > 若不一致, 则直接响应提示页面: "重复提交"

4. 使用 HttpSession 实现验证码

1). 基本原理: 和表单重复提交一致:

      > 在原表单页面, 生成一个验证码的图片, 生成图片的同时, 需要把该图片中的字符串放入到 session .

      > 在原表单页面, 定义一个文本域, 用于输入验证码.

      > 在目标的 Servlet : 获取 session 表单域中的验证码的

      > 比较两个值是否一致: 若一致, 受理请求, 且把 session 域中的验证码属性清除

      > 若不一致, 则直接通过重定向的方式返回原表单页面, 并提示用户 "验证码错误"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值