文章目录

  • 1.cookie:再次时请求头携带cookie到服务端
  • 2.登陆案例_记住我:js访问浏览器数据用document
  • 3.session:根据sessionid,服务器才能找到session(session对象在服务器内存中增加压力)
  • 4.登录案例_验证码:request.getSession().setAttribute("code",sb.toString())
  • 5.web中的k-v存储们:同一域名下可以互相调用
    • 5.1 localStorage/sessionStorage:关闭网页后,sessionStorage被自动删除,且不支持跨标签页,跨浏览器更不支持。
    • 5.2 session:同一个浏览器下打开不同标签共享cookie,因而共享了session。新浏览器会清除所有cookie,获取不到session内容了
  • 6.登录案例_jsp引入:(String) request.getAttribute(" ")
  • 7.EL:${ } = get
  • 8.JSTL:全用标签
  • 9.登录案例_直接访问success逻辑问题:request.getSession().get/setAttribute

1.cookie:再次时请求头携带cookie到服务端







如下localhost是域名,不包含协议和端口。


浏览器的设置中搜索cookies - 网站设置 - localhost。

如下方式只能查看当前域名的cookies,如上方式可以查所有域名cookies。

Map是很多个键值对,Entry同Map但就一个键值对。Cookies(类)在浏览器和服务器之间发来发去,所以不能超过4K,太大会卡。 cookie的域名过滤第一遍,访问资源位置即cookie的路径过滤第二遍。

只有localhost(域名)默认cookie存活时间是浏览器打开到关闭(不是窗口),如下改为30天(游客访问京东购物车一般也为30天)。在浏览器的设置里搜索清除浏览数据。

如下name虽相同,但是路径不同,不会覆盖。name相当于文件名,value相当于文件内容,同路径同name就会覆盖。

如上浏览器现在有两个cookies:一个是 / product galaxyNote7,另一个是 /abc product huawei。这两个cookies都会被携带进如下/abc…服务器。

2.登陆案例_记住我:js访问浏览器数据用document

如下浏览器自带在设置中搜索:密码。如下两个cookies,一个保存用户名,另一个保存密码。

//改进【Java34】中 login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>登录页面</title><link href="css/bootstrap.min.css" rel="stylesheet"><link href="css/login.css" rel="stylesheet"><script src="js/jquery.js"></script><script src="js/bootstrap.js"></script><script>// object = {n1:v1, n2:v2}  //js中的对象/* var cookie = { //cookie对象定义了一个getCookie方法getCookie: function (key) {return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;}};*/        //你传入key=name,getCookie函数返回value=adminvar getCookie = function (key) {  //匿名函数,脱离对象,不需要用cookie对象调用,直接调函数名return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;}//document.cookie 可以访问到当前页面域名下的所有cookie信息//console.log(document.cookie) -> name=admin; pwd=123  需要上面.replace按分号等切割        </script><!--1111111111111111111111111111111111111111111111111111111111111111111111--><script> $(function () { //页面加载后执行的事件var name = getCookie("name");  //上面script定义的getCookievar pwd = getCookie("pwd");/* if(name != null && name != ""){}*/if(name && pwd){ //判空同上 ,js中空字符串也就是false$("#name").val(name)  //id选择器,往body网页文本框填入$("#pwd").val(pwd)$("#remember").prop("checked",true)  //name和pwd都不为空,勾起}})</script><!--11111111111111111111111111111111111111111111111111111111111111111111111--><script>function changeImg(img) { //浏览器检测到网页的元素或属性改变,会自动刷新网页(点击验证码刷新)var time = new Date().getTime();  //时间撮img.src = "/codeServlet?time="+time //让它变,不能不加参数或故意写错即/codeServlet2,会报404,time=..这个参数一并发给服务器,虽服务器用不到,但整个属性值变了。}</script>
</head><!--1111111111111111111111111111111111111111111111111111111111111111111111111111111111111-->
<body><div class="container"><form class="form-signin" action="/LoginServlet"><h2 class="form-signin-heading text-center">登录页面</h2><input type="text"  id="name" name="username" class="form-control" placeholder="用户名" required autofocus><input type="password"  id="pwd" name="password" class="form-control" placeholder="密码" required><input type="text" placeholder="验证码" name="code" class="form-control"><img src="/codeServlet" alt="" onclick="changeImg(this)"> <br><input type="checkbox" id="remember" name="remember" value="yes"> 记住我<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button></form></div>
</body>
</html>

package com.itheima.login.web;
import com.itheima.login.service.LoginService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;@WebServlet(urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/** TODO: session : code* */String code = request.getParameter("code"); //获取前端用户写的发送的code参数即输入验证码框
//      HttpSession session = request.getSession(); //request.getSession()挂号,response只有.addCookie()String rightCode = (String) request.getSession().getAttribute("code"); //服务器通过codeServlet.java生成的if(!rightCode.equalsIgnoreCase(code)){  //验证码错误其实不应该跳到error.html ,应该停留在当前页面显示错误提示,这整段应该写在其他逻辑前面   request.getRequestDispatcher("/error.html").forward(request,response); //跳转到失败页面}//111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 String username = request.getParameter("username"); //拿到前端的参数String password = request.getParameter("password");//逆向编程 : 没有的先当它有LoginService service = new LoginService();boolean result = service.login(username,password);     if(result){/** TODO: cookie : username ,password * */String remember = request.getParameter("remember"); //前端 记住我 传来的参数if("yes".equals(remember)){Cookie nameCookie = new Cookie("name", username); //没有做数据库校验Cookie pwdCookie = new Cookie("pwd", password);nameCookie.setMaxAge(60*60*24*30); //存活30天pwdCookie.setMaxAge(60*60*24*30);response.addCookie(nameCookie);response.addCookie(pwdCookie);}response.sendRedirect("/success.html"); //重定向的简易api}else{           request.getRequestDispatcher("/error.html").forward(request,response);  //登录失败,请求转发}}
}


如下在控制台输出,在html中一样,用于数据回显。

3.session:根据sessionid,服务器才能找到session(session对象在服务器内存中增加压力)

病历本session,session记录大量信息,直接进行传递会卡,所以用cookie传sessionid(Cookie将sessionid传来传去,4k不宜过大,Cookie用sessionid标记用户)。cookie默认生命周期是会话即关闭浏览器同理session也是。

如下挂号这一行代码都一样,小域对象request获取大域对象session。< session - config > 是在tomcat软件解压后的conf文件夹里的web.xml(如订单30分钟不付款就会自动取消了)。

解决关闭浏览器cookie就没了?用Session持久化方案覆盖了tomcat默认生成的cookie即上面灰字(因为session默认保留30分钟,所以sessionid即cookie设为30分钟)。



如下删除后每次访问,生成的sessionid都是不一样的。

4.登录案例_验证码:request.getSession().setAttribute(“code”,sb.toString())

如下红字:一个存,一个取,该用什么载体实现存取?如最右边。如下是两次请求,不是一次请求链,所以request不行。存在session里好处:30分钟后自动没了。

login.html和LoginServlet.java见前面第二章节中。

//如下gui不需要掌握,被JavaME嵌入式代替 , codeServlet.java
package com.itheima.login.web;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;@WebServlet("/codeServlet")
public class CodeServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// gui 生成图片// 1 高和宽int height = 50;int width = 70;String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";Random random = new Random();// 2 创建一个图片BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 3 获得画板Graphics g = image.getGraphics();// 4 填充一个矩形// * 设置颜色g.setColor(Color.BLACK);g.fillRect(0, 0, width, height);g.setColor(Color.WHITE);g.fillRect(1, 1, width - 2, height - 2);// * 设置字体g.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 25));StringBuffer sb = new StringBuffer();// 5 写随机字for (int i = 0; i < 4; i++) {// 设置颜色--随机数g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));// 获得随机字int index = random.nextInt(data.length());String str = data.substring(index, index + 1);// 写入g.drawString(str, width / 6 * (i + 1), 20);sb.append(str);//  获取验证码数据}//TODO:  验证码保存到session中,完成上面的第一步:服务器生成验证码并进行保存request.getSession().setAttribute("code",sb.toString()); //这行最重要System.out.println("作弊:" + sb.toString());// 6 干扰线for (int i = 0; i < 3; i++) {// 设置颜色--随机数g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));// 随机绘制先g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));// 随机点g.drawOval(random.nextInt(width), random.nextInt(height), 2, 2);}// end 将图片响应给浏览器ImageIO.write(image, "jpg", response.getOutputStream());}
}


5.web中的k-v存储们:同一域名下可以互相调用

F12 - Application - 左侧如下一条cookies。在console中输入document.cookie查看数据信息:document.cookie="kkk=vvv"设置cookie,点击如下http://www.baidu…可查看到kkk vvv信息。

同域名可用:打开另一个标签,同样百度页面甚至可以搜索一些内容,F12 - Application - 左侧Cookies中同样可看到"kkk=vvv",注意不能跨浏览器。Cookies既然有k v的作用了,那客户端里为什么还要有local storage和session storage呢?

因为每次进行请求时,如下请求百度首页,可以看到request header中会携带cookies信息,每次请求时都会将全量的cookies信息作为请求的一部分进行上传如下图所示,这样cookies存储的数据不能太大,太大的话每次进行提交浪费带宽。

5.1 localStorage/sessionStorage:关闭网页后,sessionStorage被自动删除,且不支持跨标签页,跨浏览器更不支持。

所以在Html5中提出新的概念用localstorage进行存储,localstorage和cookies用法一致:1.console中输入localStorage.setItem("kk","vv"),同理在Application中点开如上Local Storage中http://www.baidu…查看到kk vv信息。2.console中输入sessionStorage.setItem("k","v"),同理在Application中点开Session Storage中http://www.baidu…查看到k v信息,sessionStorage.getItem(“k”)。

5.2 session:同一个浏览器下打开不同标签共享cookie,因而共享了session。新浏览器会清除所有cookie,获取不到session内容了

打开XAMPP的Apache服务。

1.如下设置session。


2.如下在另一个页面读取session,说明session设置在服务端。


session存在服务端能唯一辨识客户端,如下打开新的无痕(inprivate)窗口(相当于新的浏览器),无法读到。新浏览器必须先访问localhost。

php版本的session运行的原理是什么?通过cookie记录sessionid如下,php服务端为每个客户端起一个phpsessid,这个id在服务端对应数据存储区域,再次访问cookie中有phpsessid,服务端解析到这个浏览器对应的一片区域的存储内容。服务端存储结构:phpsessid-[k-v],每个浏览器分到一个不同id,因而各个数据是独立存储的。

存储在服务端的session有什么好处呢?最大好处是这个数据在客户端没有任何信息,只有它自己的标识id,这个id是没有任何用的,也是随时变化的。客户端不能通过脚本修改服务端的session,前面的localstorage这些都可以通过setItem的js脚本修改增加,session无法修改,安全性更高,适合用户敏感型数据的记录,存在客户端的这三种适合页面端的常用数据的记录。

6.登录案例_jsp引入:(String) request.getAttribute(" ")

A和B对浏览器来说,不是同一个网页,B会覆盖A。错误提示信息是在LoginServlet里,传递到B,所以有数据传递用请求转发。login.html对应红色横线,但.html写不了java的request.getA…

如下右边浏览器没有解析。

点击乌龟默认访问index.jsp,因为index.jsp被删了,所以自动跳出浏览器显示404。

如上路径就是如下,原来ROOT路径下为空(发布项目需要发在ROOT路径下),如下访问下服务器中的hello.jsp生成org/…

tomcat将hello.jsp翻译成hello_jsp.java再编译运行,只要证明hello_jsp这个类是servlet,则hello.jsp就是servlet。hello_jsp extend org…包名.类名:把tomcat中lib目录下jasper.jar解压,证明HttpJspBase.class是servlet就行,拖到idea中自动反编译成.java文件。


如下HttpJspBase.class反编译继承了HttpServlet,所以是Servlet。

如下是在上面的类中,子类必须重写_jspService,等价于service方法。

//syntax.jsp
<%@ page import="java.io.PrintWriter" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 如上一行文档声明: 响应体的格式和编码, 语言默认翻译成java --%>
<%-- JSP的主体代码 是 html 。 如何在html混入java : 三种注释语法: --%>
<%--1. 脚本片段 !!!最常用1. 核心: 会被翻译到Servlet的service方法中2. 语法:  <% 代码 %>2. 脚本表达式1. 核心: 简化 out.print2. 语法: <%="要输出的内容"%>3. 脚本声明1. 核心: 会被翻译到Servlet的成员位置(声明方法,成员属性)2. 语法:  <%! 代码 %>
--%>
<html>
<head><title>Title</title>
</head>//111111111111111111111111111111111111111111111111111111111111111111111111111111
<body><div><hr><%/** JSP中两种响应体输出流(字符), 如下两者不一样, 效果相同。*   1. PrintWriter  (优先级高于out,也高于< hr > ,所以不用)*   2. out !!! 推荐用  * */out.print("out");System.out.println("xx");PrintWriter writer = response.getWriter();  //在service方法中有response参数
//            writer.print("writer"); System.out.println("out:" + out);System.out.println("writer:" + writer);%>//111111111111111111111111111111111111111111111111111111111111111111111111111111        <hr><%out.print("xx");%><%="yy"%>//1111111111111111111111111111111111111111111111111111111111111111111111111111        <hr>                <%!public void method01(){  //service方法中又定义了method01方法,注意上行有个 !号}%><%method01();  //service方法里调用%></div>
</body>
</html>


如下解决问题:请求转发,将【Java31】中验证码输错改进(再次挂号得到之前本子设的code信息,与前端输入的比较)。

如下也在LoginServlet.java中请求转发,将【Java31】中用户名和密码输错改进。

//login.html改为login.jsp(新建jsp文件的第一行保留),前面不变
<body>
<div class="container"><form class="form-signin" action="/LoginServlet"><h2 class="form-signin-heading text-center">登录页面</h2><%--TODO: JSP --%><span style="color: red"><%String errorMsg = (String) request.getAttribute("errorMsg"); //errorMsg由LoginServlet.java中请求转发而来if(errorMsg != null){  //刚进来A页面,没错误,为nullout.print(errorMsg);}%></span><%-- todo: EL--%><input type="text"  id="name" name="username" class="form-control" placeholder="用户名" required autofocus value="${cookie.name.value}"><input type="password"  id="pwd" name="password" class="form-control" placeholder="密码" required value="${cookie.pwd.value}"><input type="text" placeholder="验证码" name="code" class="form-control"><img src="/codeServlet" alt="" onclick="changeImg(this)"> <br><%-- 用户名+密码 cookie 不为null,checked --%><input type="checkbox" id="remember" name="remember" value="yes" ${cookie.name.value !=null && cookie.pwd.value !=null ? "checked" : ""}> 记住我<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button></form>
</div>
</body>
</html>

LoginServlet.java相当于A模块(Servlet),login.jsp相当于B模块(Servlet),两者都在服务器里,通过request请求转发。

7.EL:${ } = get

//el.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><!--小域对象可获取大域对象,pageContext是最小的域对象。servletContext也叫application,因为servletContext生命周期和应用是等长的。.jsp文件中四大域对象都在,所以之前【Java36】中将index.jsp删除,避免影响。刚运行服务器默认会打开index.jsp,这样session会被获取到,以后不是第一次挂号。pageContext  < request < session < servletContext只在jsp里起作用    一次请求链(请求转发:横跨多个模块)     servletContext:可获取项目相对路径pageContext:out=pageContext.getOut(),session=pageContext.getSession()1. 生命周期:命名为Context即上下文,要和一个东西绑定pageContext 随着当前 JSP页面 的创建而创建(打开),销毁(跳到其他页面)而销毁2. Map容器-->    <!--EL : expression language 表达式语言。表达式: 用简单的符号或表达式来替代复杂的内容(简化代码)1. 简化从域对象中取值:登陆案例从jsp里取值再显示在网页上。${表达式}1. 标准${pageScope.name1} -> String name1 = (String) pageContext.getAttribute("name1");${requestScope.name2}${sessionScope.name3}${applicationScope.name4}2. 简略${name}                    取值顺序: 四个域对象从小到大--><div><%//四大域对象pageContext.setAttribute("name1","value1");request.setAttribute("name2","value2");session.setAttribute("name3","value3");application.setAttribute("name4","value4");//下行没必要,因为request在service方法里是形参,默认由tomcat创建好了pageContext.getRequest()            %><%String name1 = (String) pageContext.getAttribute("name1");out.print(name1);   //在这个页面点浏览器小图标即localhost:8080/el.jsp,网页显示value1%>${name1}  //同上两行<hr><%-- 标准,Scope范围意思 --%>${pageScope.name1}${requestScope.name2}${sessionScope.name3}${applicationScope.name4}<hr>${name1}${name2}${name3}${name4}<hr><%
//            pageContext.setAttribute("name","value1");  //一般不会用相同的name
//            request.setAttribute("name","value2");
//            session.setAttribute("name","value3");  //这行注释了,只要浏览器没关,一直存在session里。application.setAttribute("name","value4");%>${name}   //只能显示一个,从小域对象到大。</div>
</body>
</html>
//el02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><div><%/** el 简化从cookie中的取值操作*   1. ${cookie.xx} -> 获得name=xx的cookie对象*   2. ${cookie.xx.name} -> cookie.getName()*   3. ${cookie.xx.value} -> cookie.getValue()  (常用)* */Cookie nameCookie = new Cookie("key", "admin");response.addCookie(nameCookie);%>            <hr><%Cookie[] cookies = request.getCookies();  // 以前这样取cookies for (Cookie cookie : cookies) {String name = cookie.getName();if("key".equals(name)){String value = cookie.getValue();System.out.println(cookie);   // 打印对象System.out.println(name+"-"+value);}}%><hr>${cookie.key}${cookie.key.name}  ${cookie.key.value}</div>
</body>
</html>

如下第一行是cookie对象,如下是上面传统打印结果。

如下是上面el打印结果,没换行。

如下把key


如下是回显用户名和密码改进,最后添加value表示初始值。

同理如下满足条件的话,初始时就钩住记住我。

//el_03.jsp<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><div><%request.setAttribute("n1",10);request.setAttribute("n2",4);%>${n1} , ${n2} <br>     ${n1/n2} ,                  ${n1 >= n2}         ${n1 ge n2} <br>  //greater than or equals 同上行       ${n1>n2?"大" : "小"}   <hr>   <%/** empty 表达式 (EL表达式最主要简化从域对象中取值操作)*   1. 容器,没有元素, true*   2. 对象,没有地址  true* */String str = "";ArrayList<String> list = new ArrayList<>();Object obj = null;request.setAttribute("str",str);request.setAttribute("list",list);request.setAttribute("obj",obj);%>${empty str}         ${empty list}${not empty obj}</div>
</body>
</html>

8.JSTL:全用标签

如下放入lib文件夹并右击add as library。

//jstl.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--<%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>--%>
<%--前缀: c  , uri= core (四大定制标签库: java核心, xml,sql...)uri引用的哪个标签库, 前缀是用来区分关键字出自哪个标签库的,如下 c
--%>
<html>
<head><title>Title</title><c:if test=""></c:if>
</head><!--111111111111111111111111111111111111111111111111111111111111111111111111-->
<body><!--jsp : html + java  最终翻译成 java程序员在编写jsp的时候,阅读性太差, 两种语言混杂不清, 不利于长期维护做法: 希望需要书写jsp中的java代码的时候,用html标签来代替(书写风               格统一,提高代码阅读性)JSTL: jsp standard tag library  JSP标准标签库(java代码 和 html标签之间的转换规则)使用:  1. 导入jar包2. 声明--><div><span style="color: red"><%for (int i = 0; i < 5; i++) {out.print(i);   //在网页上打印}%></span><span style="color: green"><%for (int i = 0; i < 5; i++) {out.print(i);}%></span></div><!--111111111111111111111111111111111111111111111111如下全用标签111111111111--><div><span style="color: blue"><c:forEach var="i" begin="0" end="4">${i}</c:forEach></span></div>
</body>
</html>

//jstl02.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Collections" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title>
</head>
<body><!-- jstl两个标签1. c:if  -> if语句1. 必要属性: test = el表达式2. 满足条件, 标签 内的内容才会执行2. c:forEach1. 普通for循环1. var : 循环的变量(被存进域对象中)2. begin : 初始值3. end : 结束值4. step : 步进值(默认为1)5. varStatus : 循环的变量状态2. 增强for循环1. var : 循环的变量2. items : 被遍历的集合--><div><%int n = 10;                    request.setAttribute("n",n);  //n存域对象if(n > 5){out.print(true);}%><hr><c:if test="${n > 5}">  //test后面是el表达式,el就是简化从域对象中取值操作,所以上面存入域对象。true</c:if><hr><!--111111111111111111111111111111111111111111111111111111111111111111111111111111--><%  for (int i = 1; i <= 9; i+=2) {  //步进表达式out.println(i);}%><br><c:forEach var="i" begin="1" end="9" step="3" varStatus="status">${i} - ${status.count}   <%-- 循环次数 --%><br></c:forEach><hr><!--11111111111111111111111111111111111111111111111111111111111111111111111111111--><%ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"zs","ls","ww");request.setAttribute("list",list);for (String s : list) {out.println(s);}%><br><c:forEach var="s" items="${list}">${s}</c:forEach></div>
</body>
</html>

9.登录案例_直接访问success逻辑问题:request.getSession().get/setAttribute

如下login.jsp是门。success页面需要从session域对象里取值,要写java代码,所以用success.jsp(有,正常访问)。

将第一节改进的LoginServlet .java再改进如下:进门先做标记:如一些银行类APP长时间没用,再点击账户查询等会提示会话已超时/过期(默认30分钟)。若30分钟内成功通过登陆页面进到success.jsp,服务器和浏览器都没关,只是网页窗口关了,再次访问success.jsp,能成功进去。

//success.jsp,不是login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --><meta name="description" content=""><meta name="author" content=""><link rel="icon" href="../../favicon.ico"><title>Dashboard Template for Bootstrap</title><!-- Bootstrap core CSS --><link href="css/bootstrap.min.css" rel="stylesheet"><link href="css/dashboard.css" rel="stylesheet">
</head><!--111111111111111111111111111111111111111111111111111111111111111111111111111111111-->
<body>
<nav class="navbar navbar-inverse navbar-fixed-top"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div id="navbar" class="navbar-collapse collapse"><ul class="nav navbar-nav navbar-right"><li><a href="#">Dashboard</a></li><li><a href="#">Settings</a></li><li><a href="#">Profile</a></li><li><a href="#">Help</a></li></ul><form class="navbar-form navbar-right"><input type="text" class="form-control" placeholder="Search..."></form></div></div>
</nav><div class="container-fluid"><div class="row"><div class="col-sm-3 col-md-2 sidebar"><ul class="nav nav-sidebar"><li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li><li><a href="#">Reports</a></li><li><a href="#">Analytics</a></li><li><a href="#">Export</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item</a></li><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li><li><a href="">More navigation</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li></ul></div><div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"><h1 class="page-header">主页</h1><%--TODO: jstl   屋内判断:没有标记的赶出去--%><%-- <%String name = (String) request.getSession().getAttribute("name");if(name == null){request.setAttribute("errorMsg","请先登录");request.getRequestDispatcher("/login.jsp").forward(request,response);}out.print("欢迎你," + name);%>--%>// 如下用 jstl标签和el表达式 改进上面<c:if test="${empty name}"><%request.setAttribute("errorMsg","请先登录");request.getRequestDispatcher("/login.jsp").forward(request,response);%></c:if>            欢迎尊贵的VIP: ${name}    <div class="row placeholders"><div class="col-xs-6 col-sm-3 placeholder"><img src="img/demo.jpg" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4>登</h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img src="img/demo.jpg" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4>录</h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img src="img/demo.jpg" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4>成</h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img src="img/demo.jpg" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4>功</h4><span class="text-muted">Something else</span></div></div><h2 class="sub-header">Section title</h2></div></div>
</div>
</div>
<script src="js/jquery.js"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="js/bootstrap.js"></script>
</body>
</html>

如下第一次直接访问success.jsp,进不去。


【Java13】cookiesession(登陆案例(2)),jsp(登录案例(3))相关推荐

  1. JSP 登录案例实现

    <h3>用户登录</h3> <form action="doLogin.jsp"> 账号:<input type="text&q ...

  2. Request和Response-学习笔记02【请求转发和request共享数据、Request_获取ServletContext、request登录案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] Request和Response-学习笔记01[Request_原理和继承体系.Request_获取请求数据][day01] Request和Resp ...

  3. http、request和登录案例讲解

    一.HTTP 1. 概念 1.1 超文本传输协议 Hyper Text Transfer Protocol 1.2 传输协议 定义了客户端和服务器端通信时,发送数据的格式 1.3 特点: 基于TCP/ ...

  4. 注册登录案例用MVC和mysql_用MVC模式实现简单用户登录注册功能

    Model2模式 Jsp+Servlet+JavaBean MVC:开发模式 M:Model 模型层 ----> JavaBean V:View 视图层 ----> Jsp C:Contr ...

  5. 我爱Java系列---【登录案例】

    一.登录案例分析 二.实施流程 1.创建数据库web01,用户表user 代码: CREATE DATABASE web01; USE web01; CREATE TABLE USER( uid IN ...

  6. SSM整合简单登录案例

    [1] 在数据库中创建用户信息表 [2] 搭建SSM开发环境 使用idea创建登录功能的web项目 在web-inf目录下创建lib文件夹,并导入SSM的jar包. 在src下创建MVC的包结构 在s ...

  7. 案例:用户登录(html--servlet--mysql)

    案例:用户登录(html–servlet–mysql) 需要用到的内容:HTML+CSS,Tomcat,Servlet,DBUtils,c3p0,MySQL 1.创建web项目student_mana ...

  8. Android(java)学习笔记155:中文乱码的问题处理(qq登录案例)

    1. 我们在之前的笔记中LoginServlet.java中,我们Tomcat服务器回复给客户端的数据是英文的"Login Success","Login Failed& ...

  9. 项目案例模板之登录注册的实现

    项目案例模板之登录注册的实现 案例演示 案例代码 设计表 pom.xml <dependencies> <dependency> <groupId>junit< ...

最新文章

  1. tp3分布式session mysql_分布式数据库支持
  2. jQuery Ajax 实例 ($.ajax、$.post、$.get)
  3. JAVA NIO - Buffer Channel
  4. ZABBIX安装官方指南
  5. CSS 关于雪碧图预处理和后处理方案的讨论
  6. PCA的数学原理(非常值得阅读)!!!!
  7. Python istitle() 方法
  8. feather 设置坐标刻度_Matlab中将坐标轴放在原点位置
  9. Java学习的5个阶段,助大家步步攀升
  10. 全球首款光线追踪GPU
  11. java每一个小时同步_Java同步块(synchronized block)使用详解
  12. 补习系列-springboot-使用assembly进行项目打包
  13. shellcode编写
  14. 路普达-区块链系统开发项目之DAPP
  15. 现有产品的三种发展战略
  16. 初始化问题(其中含有盲区,{}和()的区别)
  17. 耗时162天,从华为外包5k转岗正式员工15k,经历的心酸只有自己知道
  18. 别总写代码,这120多个网站比涨工资都重要
  19. android xml 工具下载,安卓xml文件编辑器
  20. wireshark中筛选中文内容

热门文章

  1. SharePoint 2010 使用自定义aspx页面替换列表默认的新建(NewForm.aspx),查看(DispForm.aspx)和编辑(EditForm.aspx)页面...
  2. linux下手动删除数据库实例
  3. 安装ubuntu系统步骤
  4. linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法
  5. 部署redis mysql_【服务器部署Redis、Mysql等】-解决方式
  6. c#窗体程序生成错误_用C#语言做的窗体程序中出错恶劣怎么办?
  7. Java黑皮书课后题第10章:*10.10(Queue类)10.6节给出一个Stock类。设计一个名为Queue的类用于存储整数。像栈一样,队列保存元素。在栈中,元素后进先出。队列中元素先进先出
  8. Java黑皮书课后题第7章:7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的。输入一个负数表示输入结束。假设最高分是100
  9. mysql5.7命中率_MySQL5.7中 performance和sys schema中的监控参数解释(推荐)
  10. cocos creator基础-创建WX开放域遇到的问题