能正常安裝、啓停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTMLjavascript
理解JavaScript的基本功能,理解DOM。編寫JavaScript驗證用戶名、密碼的規則css
MySQL基礎:正常安裝、啓動MySQL,建庫、建立用戶、修改密碼、建表html
編寫PHP網頁,鏈接數據庫,進行用戶認證前端
功能描述:用戶能登錄,登錄用戶名密碼保存在數據庫中,登錄成功顯示歡迎頁面html5
課題負責人須要完成:登錄後能夠發貼;會話管理java
是一個包含表單元素的區域,在網頁中通常負責數據採集mysql
HTML(超文本標記語言)web
XML(可擴展標記語言)sql
Python、PHP、JavaScript、ASP等(腳本語言)數據庫
JavaScript、ASP、PHP、Ruby等
實驗在Win10環境下進行
計算機必須首先配置好java環境
要搭建一個網站並在服務器上運行,實現與服務器的交互,須要準備如下三樣工具
1 tomcat 搭建web服務器
http://tomcat.apache.org/download-70.cgi
2 xampp 建立數據庫並在服務器上運行
https://www.apachefriends.org/index.html
3 eclips 網頁編程集成環境
https://www.eclipse.org/downloads/
須要分別完成如下配置
1 安裝並運行tomcat,配置端口,確認服務器正常使用
2 安裝並配置xampp,實驗須要使用MySQL及Apache模塊
點擊MySQL後的Admin,順利登入管理員界面則配置正確
3 配置eclips
首先配置工做區目錄
而後確認 Java bulid path 、JRE 等等
接着添加server,添加以前安裝的tomcat
最後創建「動態網頁」工程
確認服務器在eclips界面中正常運行,完成所有準備工做
超文本標記語言(HTML)標記標籤一般被稱爲HTML標籤,HTML標籤是HTML語言中最基本的單位
HTML標籤是HTML最重要的組成部分
標籤 | 描述 |
---|---|
<!--...--> | 定義註釋。 |
<a> | 定義錨。 |
<b> | 定義粗體字。 |
<br> | 定義簡單的折行。 |
<button> | 定義按鈕 (push button)。 |
<center> | 不同意使用。定義居中文本。 |
<div> | 定義文檔中的節。 |
<font> | 不同意使用。定義文字的字體、尺寸和顏色。 |
<footer> | 定義 section 或 page 的頁腳。 |
<form> | 定義供用戶輸入的 HTML 表單。 |
<frame> | 定義框架集的窗口或框架。 |
<frameset> | 定義框架集。 |
<h1> to <h6> | 定義 HTML 標題。 |
<head> | 定義關於文檔的信息。 |
<header> | 定義 section 或 page 的頁眉。 |
<hr> | 定義水平線。 |
<html> | 定義 HTML 文檔。 |
<i> | 定義斜體字。 |
<iframe> | 定義內聯框架。 |
<img> | 定義圖像。 |
<input> | 定義輸入控件。 |
<li> | 定義列表的項目。 |
<link> | 定義文檔與外部資源的關係。 |
<map> | 定義圖像映射。 |
<mark> | 定義有記號的文本。 |
<menu> | 定義菜單列表。 |
<meta> | 定義關於 HTML 文檔的元信息。 |
<meter> | 定義預約義範圍內的度量。 |
<p> | 定義段落。 |
<param> | 定義對象的參數。 |
<pre> | 定義預格式文本。 |
<progress> | 定義任何類型的任務的進度。 |
<q> | 定義短的引用。 |
<script> | 定義客戶端腳本。 |
<section> | 定義 section。 |
<select> | 定義選擇列表(下拉列表)。 |
<table> | 定義表格。 |
<tbody> | 定義表格中的主體內容。 |
<td> | 定義表格中的單元。 |
<textarea> | 定義多行的文本輸入控件。 |
<tfoot> | 定義表格中的表注內容(腳註)。 |
<th> | 定義表格中的表頭單元格。 |
<thead> | 定義表格中的表頭內容。 |
<time> | 定義日期/時間。 |
<title> | 定義文檔的標題。 |
<u> | 定義下劃線文本。 |
特別的,可使用<% ··· %>在html中嵌套java等服務器端代碼
<html> <head> 屬性設置 <title></title> 引入外部的文件 </head> <body> 數據內容和其餘的標籤 </body> </html>
層疊樣式表(Cascading Style Sheets)是一種用來表現HTML或XML等文件樣式的計算機語言
CSS不只能夠靜態地修飾網頁,還能夠配合各類腳本語言動態地對網頁各元素進行格式化
最直觀的做用是讓你的界面更好看
<%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="en" class="no-js"> <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 rel="stylesheet" type="text/css" href="assets/css/normalize.css" /> <link rel="stylesheet" type="text/css" href="assets/css/demo.css" /> <!-- background picture --> <link rel="stylesheet" type="text/css" href="assets/css/component.css" /> <!-- IF-IE Browser --> <script src="js/html5.js"></script> </head> <body> <% session.setAttribute("admin",""); session.setAttribute("username",""); String msg=""; String hint = (String)request.getParameter("hint"); String register = (String)request.getParameter("register"); if(hint!=null){ msg="用戶名或密碼錯誤!"; } if(register!=null){ %> <script type="text/javascript" >window.location="login.jsp"; alert("註冊成功!"); </script> <% } %> <div class="container demo-1"> <div class="content"> <div id="large-header" class="large-header"> <canvas id="demo-canvas"></canvas> <div class="logo_box"> <h3 style="font-size: 40px;font-family: 'times new roman';">Welcome</h3> <form action="LoginController" name="login" method="post" onsubmit="return checkLogin();"> <div class="input_outer"> <span class="u_user"></span> <input name="username" id="username" class="text" style="color: #FFFFFF !important" type="text" placeholder="請輸入用戶名"> </div> <div class="input_outer"> <span class="us_uer"></span> <input name="password" id="password" class="text" style="color: #FFFFFF !important; position:absolute; z-index:100;"value="" type="password" placeholder="請輸入密碼"> </div> <div class="mb2"><a class="act-but submit"><button type="submit" style="background:#204D74;border:#204D74;color: #FFFFFF">登陸</button></a></div> <span style="float:left;color:red"><%=msg%></span> <h style="float:right;">尚未帳號?<a href="register.jsp">當即註冊</a></h> </form> </div> </div> </div> </div><!-- /container --> <!-- mouse --> <script src="assets/js/TweenLite.min.js"></script> <script src="assets/js/EasePack.min.js"></script> <script src="assets/js/demo-1.js"></script> <!-- judge --> <script src="assets/js/loginform.js"></script> </body> </html>
xampp提供了圖形化的數據庫設計界面
你能夠在控制檯中直接用SQL語言操做,或者在界面中,看着控制檯中的代碼邊作邊學
上圖展現了一個數據庫的最基本組織結構:數據庫—表單—字段
編輯字段時首先確認數據庫正在使用的字符集,特別的,必定要注意數據類型
首先明確.jsp和.js的區別
JSP:全名爲Java Server Pages,中文名叫java服務器頁面,其根本是一個簡化的Servlet設計
JavaScript:一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型
它的解釋器被稱爲JavaScript引擎,爲瀏覽器的一部分,普遍用於客戶端的腳本語言,用來給HTML網頁增長動態功能
如下代碼用於檢查登陸時輸入內容是否爲空
function checkLogin(){ var username = document.getElementsByName("username")[0].value; var password = document.getElementsByName("password")[0].value; if(username=="" && password==""){ alert("請輸入用戶名和密碼!"); return false; }else if(username==""){ alert("請輸入用戶名!"); return false; }else if(password==""){ alert("請輸入密碼!"); return false; } }
須要 import java.sql 和 javax.servlet,請首先進行確認
編寫數據庫接口,其中dbURL須要根據實際狀況修改
package com.myjava; import java.sql.*; public class DAO{ private Connection conn; private Statement statement; private ResultSet rs; private String dbURL = "jdbc:mysql://localhost:3306/20164306?user=root&useSSL=true"; public DAO(){ conn = null; statement = null; rs = null; } public boolean connection(){ try{ Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(dbURL); statement = conn.createStatement(); }catch(SQLException ex){ ex.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return (conn==null); } public int update(String sqlStatement) throws SQLException { return statement.executeUpdate(sqlStatement); } public ResultSet query(String sqlStatement) throws SQLException{ return statement.executeQuery(sqlStatement); } public void close(){ try{ if(rs!=null){ rs.close(); } if(statement!=null){ statement.close(); }if(conn!=null){ conn.close(); } }catch(Exception e){ e.printStackTrace(); } } }
如下是一段簡單的代碼,在登陸時對用戶名和密碼進行驗證,並確認用戶身份
package com.myservlet; import javax.servlet.http.*; import javax.servlet.annotation.WebServlet; import com.myjava.*; @WebServlet("/LoginController") public class LoginController extends HttpServlet{ private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest req, HttpServletResponse res) { this.doPost(req,res); } public void doPost(HttpServletRequest req, HttpServletResponse res){ String username = req.getParameter("username"); String password = req.getParameter("password"); HttpSession httpSession = req.getSession(true); UsersCl uc = new UsersCl(); try { if(username==null||username=="" ||password==null||password=="") { res.sendRedirect("login.jsp"); }else if(uc.checkLogin(username,password)){ if(uc.checkAuthority(username)){ httpSession.setAttribute("admin", username); httpSession.setAttribute("adminpw",password); res.sendRedirect("admincenter.jsp"); }else{ httpSession.setAttribute("username", username); httpSession.setAttribute("password",password); res.sendRedirect("homepage.jsp"); } }else{ res.sendRedirect("login.jsp?hint=1"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
具體方法定義以下
package com.myjava; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; public class UsersCl { private DAO dao; private int pageCount; private int rowCount; public UsersCl(){ dao = new DAO(); } public boolean checkAuthority(String u) { boolean b=false; if(u==null||u=="") { b=false; }else { try { dao.connection(); String sqlQuery = "select authority from users where username='"+u+"'"; ResultSet rs = dao.query(sqlQuery); if(rs.next()){ String authority = rs.getString(1); if(authority.equals("A")){ b = true; }else{ b = false; } }else{ b = false; } }catch(Exception e) { e.printStackTrace(); }finally { dao.close(); } } return b; } public boolean checkLogin(String u,String p){ boolean b = false; try { dao.connection(); String sqlQuery = "select password from users where username='"+u+"'"; ResultSet rs; rs = dao.query(sqlQuery); if(rs.next()){ String confirPassword = rs.getString(1); if(p.equals(confirPassword)){ b = true; }else{ b = false; } }else{ b = false; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { dao.close(); } return b; } public boolean hasUsername(String username) { boolean b=false; try { dao.connection(); String sqlQuery = "select * from users where username='"+username+"'"; ResultSet rs = dao.query(sqlQuery); b = rs.next(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { dao.close(); } return b; } //add new user public int update(String sql){ int b = -1; try { dao.connection(); dao.update(sql); b=0; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { dao.close(); } return b; } public Users getUserByUname(String username,String password) { Users us = new Users(); dao.connection(); try { ResultSet rs=dao.query("select * from users where username='"+username+"'"); if(rs.next()) { us.setUsername(rs.getString(1)); us.setPassword(rs.getString(2)); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return us; } public ArrayList<Users> getUser(int pageSize,int pageNow) { rowCount = 0; pageCount = 0; ArrayList<Users> userlist = new ArrayList<Users>(); try { dao.connection(); ResultSet rs = dao.query("select count(*) from users where authority='U' || authority='A'"); if(rs.next()){ rowCount = rs.getInt(1); } if(rowCount==0) { pageCount=1; } else if(rowCount%pageSize == 0){ pageCount = rowCount/pageSize; } else{ pageCount = rowCount/pageSize + 1; } rs = dao.query("select * from users order by users.authority asc limit "+pageSize*(pageNow-1)+","+pageSize); while(rs.next()){ Users user = new Users(); user.setUsername(rs.getString(1)); user.setPassword(rs.getString(2)); user.setAuthority(rs.getString(3)); userlist.add(user); } } catch (SQLException e) { e.printStackTrace(); } finally { dao.close(); } return userlist; } public int getPageCount() { return pageCount; } public int getRowCount() { return rowCount; } public int delete(String sql) throws SQLException { dao.connection(); int i = dao.update(sql); dao.close(); return i; } }
網頁實現了用戶名、密碼認證,用戶訪問控制,記錄編輯與同步等功能
解決了用戶名、密碼建立、翻頁查看等操做中的邊界處理問題
SQL注入,經過把SQL命令插入到Web表單提交,欺騙服務器執行(不能夠)
XSS是一種常常出如今web應用中的計算機安全漏洞,它容許用戶將代碼植入頁面(不可以)
由於代碼量較大,因此無法在博客中mark所有代碼,功能也僅展現了部分
大概有40多個文件吧,感興趣的能夠單獨聯繫我
攻擊部分,由於是提早作的,理解的不是很透,但願經過實驗9深刻理解