会话技术:
会话:浏览器访问服务器端,发送多次请求,接受多次响应。直到有一方断开连接。会话结束。 解决问题:可以使用会话技术,在一次会话的多次请求之间共享数据。 分类: 客户端会话技术 Cookie 服务器端会话技术 Session
客户端会话技术:Cookie 小饼干的意思
服务器端不需要管理,方便。但是不安全。 原理: 1.客户端第一次请求服务器端,服务器作出响应时,会发送set-cookie头,携带需要共享的数据 2.当客户端接受到这个响应,会将数据存储在客户端 3.当客户端再次请求服务器端时,会通过cookie请求头携带着存储的数据。 4.服务器接受带请求,会获取客户端携带的数据。 Java代码实现: 1.发送cookie //1.创建Cookie对象。 Cookie c = new Cookie("name","zhangsan"); //2.通过response发送cookie response.addCookie(c); 2.接收cookie //1.获取所有cookie数组 Cookie[] cs = request.getCookies(); //2.遍历数组 if(cs != null){ for (Cookie c : cs) { //获取cookie的名称 String name = c.getName(); //判断名称,得到目标cookie if("name".equals(name)){ //获取值 String value = c.getValue(); System.out.println(name+":"+value); } } } Cookie的细节: 1.默认情况下,cookie保存在客户端浏览器内存中。 需要将数据持久化存储在客户端的硬盘上。 设置cookie的存活时间。setMaxAge(int s); 2.Cookie是不支持中文数据的。如果要想存储中文数据。需要转码。 URL编码 功能:记住用户名和密码 服务器端会话技术:Session 主菜的意思 服务器端需要管理数据,麻烦,但是安全。 原理: 1.客户端访问服务器端,在服务器端的一个对象(Session)中存储了数据 2.服务器给客户端作出响应时,会自动将session对象的id通过响应头 set-cookie:jsessionid=xxx 发送到客户端 3.客户端接受到响应,将头对应的值存储到客户端 4.客户端再次请求时,会携带着请求头 cookie:jsessionid=xxx. 5.服务器接受到请求,通过jsessionid的值,找到对应的session对象。就可以获取对象中存储的数据了。 Session技术依赖于cookie。 获取session HttpSession session = request.getSession(); 域对象: setAttribute(): getAttribute(): removeAttribute(): session细节: 1.客户端关闭了,两次session一样吗? 不一样。因为客户端浏览器内存释放了,jsessionid没了。 服务器关闭了,两次session一样吗? 不一样。因为服务器内存释放了,session对象没了。 session的钝化: 当服务器正常关闭时,会将session对象写入到服务器的硬盘上。 session的活化: 当服务器正常启动时,会将session文件还原为session对象 2.session对象的销毁 1.session超时 <session-config> <session-timeout>30</session-timeout> </session-config> 2.invalidate():session销毁 3.服务器关闭。 3.session依赖于cookie,如果客户端禁用了cookie,那么session该咋办? URL重写。4.getSession方法的重载: boolean: true:默认值 通过id查找session,如果没找到,新创建一个 false: 通过id查找session,如果没找到,返回null 第一次创建一个新的对象
代码演示:
1 package cookie; 2 3 import java.io.IOException; 4 import java.sql.PreparedStatement; 5 import java.sql.SQLException; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest;10 import javax.servlet.http.HttpServletResponse;11 import javax.servlet.http.HttpSession;12 13 public class LoginServlet extends HttpServlet {14 15 private static final long serialVersionUID = -4372317815130787297L;16 17 public void doGet(HttpServletRequest request, HttpServletResponse response)18 throws ServletException, IOException {19 try {20 //1.获取验证码21 String checkCode = request.getParameter("checkCode");22 //2.获取生成的验证码23 HttpSession session = request.getSession();24 String checkCode_pro = (String) session.getAttribute("checkCode_pro");25 26 //1.设置编码27 request.setCharacterEncoding("utf-8");28 //2.获取用户名和密码29 String username = request.getParameter("username");30 String password = request.getParameter("password");31 //3.操作数据库,获取数据库连接32 //4.定义sql33 //5.获取pstmt对象34 PreparedStatement pstmt = JDBCUtils.getConnection().prepareStatement("select * from user where username = ? and userpassword = ?");35 //6.设置参数36 pstmt.setString(1, username);37 pstmt.setString(2, password);38 //7.执行sql39 //8.验证,判断40 //判断验证码是否正确41 if(checkCode_pro.equalsIgnoreCase(checkCode)){42 //正确43 //注册 或 登录44 session.setAttribute("regist_msg", "验证码正确");45 if(pstmt.executeQuery().next()){46 //登陆成功47 request.setAttribute("username", username);48 request.getRequestDispatcher("/success.jsp").forward(request, response);49 }else{50 //登陆失败51 request.setAttribute("msg", "用户名或密码错误!");52 request.getRequestDispatcher("/login.jsp").forward(request, response); 53 }54 }else{55 //错误56 session.setAttribute("regist_msg", "验证码错误");57 response.sendRedirect("/colloquy/login.jsp");58 //将session中存储的验证码清空59 session.removeAttribute("checkCode_pro"); 60 } 61 } catch (SQLException e) {62 e.printStackTrace();63 }64 }65 66 public void doPost(HttpServletRequest request, HttpServletResponse response)67 throws ServletException, IOException {68 this.doGet(request, response);69 }70 }
1 package cookie; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse;10 11 public class RemServlet extends HttpServlet {12 13 private static final long serialVersionUID = -3477344209817695234L;14 15 public void doGet(HttpServletRequest request, HttpServletResponse response)16 throws ServletException, IOException {17 //1.获取用户名和密码,复选框18 String username = request.getParameter("username");19 String password = request.getParameter("password");20 //2.判断用户名和密码是否正确21 if("zhangsan".equals(username) && "123".equals(password)){22 //登陆成功23 if(request.getParameter("rem") != null){24 //记住密码25 //1.创建cookie26 Cookie c_username = new Cookie("username", username);27 Cookie c_password = new Cookie("password", password);28 //2.设置存活时间29 c_username.setMaxAge(60 * 60 * 24 * 7);30 c_password.setMaxAge(60 * 60 * 24 * 7);31 //3.发送cookie32 response.addCookie(c_username);33 response.addCookie(c_password);34 }35 request.setAttribute("username", username);36 request.getRequestDispatcher("/success.jsp").forward(request, response);37 }else{38 //登陆失败39 request.setAttribute("msg", "用户名或密码错误!");40 request.getRequestDispatcher("/login.jsp").forward(request, response);41 }42 }43 44 public void doPost(HttpServletRequest request, HttpServletResponse response)45 throws ServletException, IOException {46 this.doGet(request, response);47 }48 }
1 package cookie; 2 3 import java.awt.Color; 4 import java.awt.Graphics; 5 import java.awt.image.BufferedImage; 6 import java.io.IOException; 7 import java.util.Random; 8 9 import javax.imageio.ImageIO;10 import javax.servlet.ServletException;11 import javax.servlet.http.HttpServlet;12 import javax.servlet.http.HttpServletRequest;13 import javax.servlet.http.HttpServletResponse;14 15 /**16 * 生成验证码17 * @author rongsnow18 *19 */20 public class CheckCodeServlet extends HttpServlet {21 22 private static final long serialVersionUID = 8583894656985684165L;23 24 public void doGet(HttpServletRequest request, HttpServletResponse response)25 throws ServletException, IOException {26 27 int width = 100;28 int height = 50;29 //1.创建图片30 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);31 //2.装饰图片32 //2.1设置背景色33 //2.1.1 获取画笔对象34 Graphics g = image.getGraphics();35 //2.2.2 设置画笔的颜色36 g.setColor(Color.pink);37 //2.2.3 填充背景色38 g.fillRect(0, 0, width, height);39 40 //2.2 画边框41 g.setColor(Color.GREEN);42 g.drawRect(0, 0, width - 1, height - 1);43 44 //2.3 写入验证码45 g.setColor(Color.RED);46 47 String msg = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";48 Random ran = new Random();49 StringBuilder sb = new StringBuilder();50 for (int i = 1; i <= 4; i++) {51 int index = ran.nextInt(msg.length());//随机生成角标52 String s = String.valueOf(msg.charAt(index));53 sb.append(s);54 55 g.drawString(s, width/5 * i, height/2);56 }57 String checkCode_pro = sb.toString();58 //将生成的验证码 存入session59 request.getSession().setAttribute("checkCode_pro", checkCode_pro);60 61 //2.4画干扰线62 g.setColor(Color.BLUE);63 64 for (int i = 0; i < 5; i++) {65 //动态生成坐标点66 int x1 = ran.nextInt(width);67 int x2 = ran.nextInt(width);68 int y1 = ran.nextInt(height);69 int y2 = ran.nextInt(height);70 g.drawLine(x1, y1, x2, y2);71 }72 73 //3.将图片数据 写入到 response输出流中74 ImageIO.write(image, "jpg", response.getOutputStream());75 }76 77 public void doPost(HttpServletRequest request, HttpServletResponse response)78 throws ServletException, IOException {79 80 this.doGet(request, response);81 }82 }
1 package cookie; 2 3 import java.io.FileNotFoundException; 4 import java.io.FileReader; 5 import java.io.IOException; 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 import java.sql.ResultSet; 9 import java.sql.SQLException;10 import java.sql.Statement;11 import java.util.Properties;12 13 /**14 * JDBC 工具类15 * @author rongsnow16 *17 */18 public class JDBCUtils {19 private static String url = null;20 private static String user = null;21 private static String password = null;22 private static String driverClass = null;23 24 static{25 /*26 * 加载配置文件,为每一个值赋值27 */28 try {29 //1.创建properties对象30 Properties pro = new Properties();31 //获取配置文件的真实路径32 //2.关联资源文件33 pro.load(new FileReader(JDBCUtils.class.getClassLoader().getResource("jdbc.properties").getPath()));34 //3.获取数据35 url = pro.getProperty("url");36 user = pro.getProperty("user");37 password = pro.getProperty("password");38 driverClass = pro.getProperty("driverClass");39 //4.注册驱动40 Class.forName(driverClass);41 42 } catch (FileNotFoundException e) {43 e.printStackTrace();44 } catch (IOException e) {45 e.printStackTrace();46 } catch (ClassNotFoundException e) {47 e.printStackTrace();48 }49 }50 51 /**52 * 获取数据库连接53 * @throws SQLException 54 */55 public static Connection getConnection() throws SQLException{56 57 return DriverManager.getConnection(url, user, password);58 }59 60 /**61 * 释放资源62 * @throws SQLException 63 */64 public static void close(Connection conn,Statement stmt,ResultSet rs) throws SQLException{65 if(rs != null){ //预防空指针异常66 rs.close();67 }68 if(stmt != null){ //预防空指针异常69 stmt.close();70 }71 if(conn != null){ //预防空指针异常72 conn.close();73 }74 }75 public static void close(Connection conn,Statement stmt) throws SQLException{76 if(stmt != null){ //预防空指针异常77 stmt.close();78 }79 if(conn != null){ //预防空指针异常80 conn.close();81 }82 }83 public static void close(Connection conn) throws SQLException{84 if(conn != null){ //预防空指针异常85 conn.close();86 }87 }88 }
web.xml
1 27 8 9 10 15This is the description of my J2EE component 11This is the display name of my J2EE component 12LoginServlet 13cookie.LoginServlet 1416 21This is the description of my J2EE component 17This is the display name of my J2EE component 18RemServlet 19cookie.RemServlet 2022 27 28 29This is the description of my J2EE component 23This is the display name of my J2EE component 24checkcode 25cookie.CheckCodeServlet 2630 33LoginServlet 31/loginServlet 3234 37RemServlet 35/remServlet 3638 41 42 43checkcode 39/checkCodeServlet 4044 46index.jsp 45
jdbc.properties配置文件内容
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql:///mydbuser=rootpassword=123login.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 3 4 5 663My JSP 'login.jsp' starting page 7 15 16 17 <%18 //1.获取所有cookie19 Cookie[] cs = request.getCookies();20 String username = "";21 String password = "";22 //2.遍历cookie数组23 if(cs != null){24 for(Cookie c : cs){25 //获取名称26 String name = c.getName();27 if("username".equals(name)){28 username = c.getValue();29 }30 if("password".equals(name)){31 password = c.getValue();32 }33 }34 } 35 %>36 37
<%=request.getAttribute("msg")==null ? "" : request.getAttribute("msg") %>
64 <%=session.getAttribute("regist_msg")==null ? "" : session.getAttribute("regist_msg") %>
65 66
success.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 3 4 5 6My JSP 'success.jsp' starting page 7 8 9 10 <%=11 request.getAttribute("username")12 %>,欢迎您!13 14 15
所使用的MySQL语句
1 -- 创建用户信息表 user,并指定主键且自增长 2 CREATE TABLE USER( 3 uid INT PRIMARY KEY AUTO_INCREMENT, 4 username VARCHAR(32), 5 userpassword VARCHAR(32) 6 ); 7 8 -- 查询所有列 9 SELECT * FROM USER;10 11 -- 添加数据12 INSERT INTO USER(username,userpassword) VALUE ('zhangsan','123');13 INSERT INTO USER(username,userpassword) VALUE ('lisi','1234');14 INSERT INTO USER(username,userpassword) VALUE ('wangwu','234');15 INSERT INTO USER(username,userpassword) VALUE ('zhaoliu','1234');16 INSERT INTO USER(username,userpassword) VALUE ('sisi','234');