登录注册不是很清楚
jsp
Java Server Pages Java服务器端页面
概念
一种既可以写html,css,javascrpt,又可以写java代码的动态网页开发技术
功能
简化书写
原理
本质上就是servalert
服务器查找jsp,如果存在,又jsp转化引擎转换为.java的类文件(定义的是Servlet),调用javac,编异成字节码文件,然后就可以使用对外提供服务
jsp脚本
勇于初识java代码
<%%>定义在servlet方法中
<%!%>定义在成员变量中
<%=%>定义在Servlet输出方法中
<%--定义在成员变量中--%>
<%!
int b=200;
%>
<%--定义在Servlet的方法中--%>
<%
int a=100;
%>
<%--直接定义在输出语句中--%>
<%="aaa"%>
定时刷新refresh
- 响应头的格式
refresh:秒数;url=跳转的路径 - 设置响应头
response.setHeader(String key,String value);设置字符串形式的响应头
response.addHeader(String key,String value);追加响应头, 若之前设置设置过这个头,则追加;若没有设置过,则设置 - 设置 定时刷新
respinse.setHeader(“refresh”,“3;url=/login.html”)
package jsp20190906;
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.io.IOException;
/**
* @Description:刷新技术
* @Author:@李小白
* @Date:2019/9/6 21:27
*/
@WebServlet(name = "ServletDemo01")
public class ServletDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置撒刷新技术
//防止响应乱码
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("3秒后重新跳回登录页面");
response.setHeader("refresh","3;url=/login.html");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
会话技术
概念:
在一次会话中共享数据.浏览器和服务器的一次通信,包含多次请求,多次响应.在这次会话中共享数据
分类
- 客户端会话技术(cookie):可减轻服务端压力,数据不安全
- 服务端会话技术(Session):
客户端会话技术
原理
- 客户端发送一个资源,服务端做出响应,会发送set-cookie头,共享数据,客户端接收到响应后,就会把数据存储到客户端的浏览器中
- 客户端再次请求的时候,会通过set-cookie头进行携带数据,服务端接收到请求会解析获取的数据
java实现cookie
甜点,曲奇饼
- 发送Cookie
//创建Cookie对象
Cookie c = new Cookie(“username”,“zhangsan”);
//发送Cookie对象
respinse.addCookie©; - 接收Cookie
//获取所有的cookie
Cookie[] cs = request.getCookie();
//遍历
if(sc!=null){
for(Cookie c:cs){
String name = c.getName();
if(“msg”.equals(name)){
String value = c.getValue();
}
}
}
package jsp20190906;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Description:TODO
* @Author:@李小白
* @Date:2019/9/6 22:14
*/
@WebServlet(name = "ServletDemo02")
public class ServletDemo02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//用Cookie实现java
//第一次请求的时候
//创建一个Cookie对象
Cookie username = new Cookie("usernam", "zhangsan");
Cookie password = new Cookie("password", "123456");
//设置保存时间
username.setMaxAge(60*60*7);
password.setMaxAge(60*60*7);
//响应Cookie
response.addCookie(username);
response.addCookie(password);
//第二次请求的时候,取出Cookie
Cookie[] cookies = request.getCookies();
//遍历取出来的Cookie数字
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")){
String value = cookie.getValue();
System.out.println(value);
}
if (cookie.getName().equals("password")) {
String value = cookie.getValue();
System.out.println(value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
- 案例:记住用户名和密码
只更改登陆成功后和页面上显示的部分
两处都用Cookie会话来处理
加入德鲁伊和MySql的资源,和德鲁伊的配置
package denglu;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;
/**
* @Author: ShenMouMou
* @CreateTime: 2019-09-04 14:47
* @Description:西部开源教育科技有限公司
*/
@WebServlet(name = "LoginServlet", value = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("收到请求了");
//处理post请求和响应的乱码
try {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取请求参数的值
String username = request.getParameter("username");
String password = request.getParameter("password");
//对username和password做二次校验
String regx = "[a-zA-Z]{6,16}";
String regx2 = "[0-9]{6,16}";
if (username.matches(regx) && password.matches(regx2)) {
//查询数据库,比对用户名和密码
boolean b = JDBCUtils.login(username, password);
if (b) {
//判断登录成功之后记住密码
//判断是否记记住
String rember = request.getParameter("rember");
//建立Cookie对象
Cookie username1 = new Cookie("username", "lisi");
Cookie password1 = new Cookie("password", "123456");
//设置保存时间
username1.setMaxAge(60*60*7);
password1.setMaxAge(60*60*7);
//响应Cookie
response.addCookie(username1);
response.addCookie(password1);
//我们可以跳转到主页
request.setAttribute("username", username);
request.getRequestDispatcher("/WEB-INF/home.jsp").forward(request, response);
} else {
//给出提示
request.setAttribute("msg", "用户名或密码输入错误,请重新输入");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
} else {
response.getWriter().write("<h1 style='color:red'>呵呵!哥们,有经验</h1>");
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
<%--
Created by IntelliJ IDEA.
User: ShenMouMou
Date: 2019/9/4
Time: 14:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--密码显示在网页上--%>
<%
//第二次请求
Cookie[] cookies = request.getCookies();
// 开始遍历cookie中的数据,在响应不为空的情况下
if (cookies!=null) {
for (Cookie cookie : cookies) {
if(cookie.getName().equals("username")){
String value = cookie.getValue();
System.out.println(value);
}
if (cookie.getValue().equals("password")) {
String value = cookie.getValue();
System.out.println(value);
}
}
}
%>
<center>
<form action="${pageContext.request.contextPath}/login" method="post" onsubmit="return checkAll()">
用户名: <input type="text" name="username" placeholder="请输入用户名6-16位字母" value="<%=username%>"/>
<br>
密码: <input type="password" name="password" placeholder="请输入密码6-16位数字" value="<%=password%>"/>
<br>
记住密码:<input type="radio" name="rember" value="7" /> 记住一周
<input type="radio" name="rember" value="30" /> 记住一月
<br>
<input type="submit" value="登录">
</form>
<div style="color:red">
<%--在页面上取出域中的数据--%>
<%=request.getAttribute("msg") == null ? "" : request.getAttribute("msg")%>
</div>
</center>
<script>
function checkAll() {
return true;
}
</script>
</body>
</html>
JDBC部分
package denglu;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
/**
* @Author: ShenMouMou
* @CreateTime: 2019-09-04 15:02
* @Description:西部开源教育科技有限公司
*/
public class JDBCUtils {
public static boolean login(String username,String password) throws Exception {
//德鲁伊连接池
Properties properties = new Properties();
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(in);
DataSource dataSource = new DruidDataSourceFactory().createDataSource(properties);
Connection connection = dataSource.getConnection();
//QueryRunner runner = new QueryRunner(dataSource);
//runner.query("select * from users where username=? and password=?",new BeanHandler<>(),username,password);
PreparedStatement preparedStatement = connection.prepareStatement("select * from user where username=? and password=?");
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
ResultSet resultSet = preparedStatement.executeQuery();
return resultSet.next();
}
}
Cook细节
1.持久化
默认存储在浏览器的内存中,关闭浏览器的话就会释放内存,Cookie消失
- 解决:
设置保存时间
request.setMaxAge(int second):
正数:放在硬盘上
负数:默认值为-1,存储在浏览器的内存中
0:删除Cookie中的数据
2.不垮浏览器
3.不支持中文,cookie可以直接存储中文,不需要编码解码了
- 注意Tomcat8.5及以上支持中文cookie,Tomcat7.0不支持中文cookie
- 解决不可用中文编码的情况:
package jsp20190906;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
/**
* @Description:Cookie
* @Author:@李小白
* @Date:2019/9/6 22:14
*/
@WebServlet(name = "ServletDemo02")
public class ServletDemo02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//用Cookie实现java
//第一次请求的时候
//创建一个Cookie对象
//先进行编码
Cookie username = new Cookie("username",URLDecoder.decode("王五","utf-8"));
//设置保存时间
username.setMaxAge(60*60*7);
//响应Cookie
response.addCookie(username);
//第二次请求的时候,取出Cookie
Cookie[] cookies = request.getCookies();
//遍历取出来的Cookie数字
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")){
String value = cookie.getValue();
//先进行解码,但是getParmmter不需要解码,getQueryString需要解码
String decode = URLDecoder.decode(value, "utf-8");
System.out.println(decode);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
动态获取配置路径
${pangeContext.request.contextpath}
服务端会话技术Session
主菜,硬菜
将数据存储在服务器端
原理
Session依赖于Cookie的存在
浏览器和服务器在一次会话中共享数据
java实现Session
Session细节
-
1.浏览器关闭了,session不一样了?
Cookie没了。jsessionid没了。
服务器关闭了,session一样吗?不一样。内存释放了。 -
2.优化:虽然对象不一样了,但是session中存储的数据还是一样的
钝化:服务器正常关闭后,session对象被写入硬盘的文件中
活化:服务器开启后,将文件还原为内存的session对象 -
3.Session生命周期
创建:request.getSession()
会根据jsessionind值查找是否存在session对象,如果没有找到的话就会自动创建一个 -
销毁:
1.服务器关闭
2.session超时
30
3.自杀 invalidate():session自杀了
-
4.如果客户端禁用了 cookie,session该如何自处?
* 客户端禁用了cookie,session将不一样。
URL重写:
http://localhost:8080/day09/s1;jsessionid=731DED0DC4F0AA06CDBB815733D4043E
PrintWriter pw = response.getWriter();
HttpSession session = request.getSession();
String id = session.getId();String href = “/day09/s1”;
href = response.encodeRedirectURL(href);
System.out.println(href);
pw.write(“s1”); -
5获取session:
getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
getSession(boolean flag):
true:默认值,会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null
登录:
* 验证码
* 分析数据使用几次?
* 一次:request,转发
* 一个用户多次 session,重定向
* 所有用户共享: ServletContext 重定向