日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java13】cookiesession(登陆案例(2)),jsp(登录案例(3))

發布時間:2024/4/24 java 205 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java13】cookiesession(登陆案例(2)),jsp(登录案例(3)) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 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))的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。