会话管理
cookie
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>cookie</title>
</head>
<body>
<!-- Cookie存储的基本使用 -->
<!--
(1)创建Cookie对象,绑定数据(在服务器端获取指定数据通过cookie保存)
** Cookie cookie = new Cookie(key,value);
(2)发送Cookie对象(从服务端---》客户端)
** response.addCookie(cookie)
(3)获取Cookie,获取数据
** Cookie [] cookies = request.getCookies()
注意事项:
如果通过cookie进行保存数据时,数据中含有特殊的字符:空格,@&*等等
需要进行编码和解码
编码 URLEncoder.encode("字符串","utf-8");
解码 URLDecoder.decode("字符串","utf-8");
-->
<%
//1.创建Cookie 保存用户名 键值对的形式
Cookie cookieUsername = new Cookie("username",URLEncoder.encode("李小香", "utf-8"));
//2.通过response响应对象发送的浏览器客户端进行保存
response.addCookie(cookieUsername);
%>
</body>
</html>
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
获取cookied.jsp页面中保存的username
-->
<%
//获取cookie
Cookie[] cookies = request.getCookies();
//遍历
//避免空指针异常的出现,判断非空
if (null != cookies) {
for (Cookie cookie : cookies) {
//out.println(cookie.getName()+" === "+cookie.getValue()+"<br/>");
if ("username".equals(cookie.getName())) {
//由于当初保存的时候含有特殊字符,进行了编码 获取后 需要进行解码
out.println(cookie.getName() + " === " + URLDecoder.decode(cookie.getValue(), "utf-8")
+ "<br/>");
}
}
}
%>
</body>
</html>
session
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>session</title>
</head>
<body>
<%
/*
session会话
1.session属于jsp内置对象
2.session可以临时存储数据在一个会话中,达到数据共享的目的
3.session所保存的数据是在服务器端,与Cookie相反。
4.方法:setAttribute getAttribute()
5.与Cookie不同的是:cookie只能保存文本 session可以保存Object
*/
//通过session保存用户名
session.setAttribute("username", "李小香");
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>session</title>
</head>
<body>
<%
//获取session
String str = (String) session.getAttribute("username");
out.println(str);
%>
</body>
</html>
session和Cookie的区别
运用以上知识运用到后台登录主页界面
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 实现自动登录 -->
<%
String username = null;
//获取cookie
Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = URLDecoder.decode(cookie.getValue(), "utf-8");
}
}
}
if (username != null) {
response.sendRedirect("admin.jsp");
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>新闻发布系统-管理员登录</title>
<!-- 引入login.css -->
<link rel="stylesheet" type="text/css" href="css/login.css" />
<!-- JavaScript 验证表单区域 -->
<script type="text/javascript">
var code = "";//保存验证码
//验证的需求:利用随机数 +拼接+数组存储需要随机的字符
var arr = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ];
function $(id) {
return document.getElementById(id);
}
//加载函数
window.onload = function() {
//设置username的焦点事件
$("username").onblur = function() {
var usernameValue = this.value;
if (!usernameValue) {
alert('用户名不能为空')
return false;
}
return true;
}
//设置password的焦点事件
$("password").onblur = function() {
var passwordValue = this.value;
if (!passwordValue) {
alert('密码不能为空')
return false;
}
return true;
}
//获取表单设置表单的阻止提交事件
$("myForm").onsubmit = function() {
if (!$("username").onblur() || !$("password").onblur()
|| !$("code").onblur()) {
return false;
}
return true;
}
//获取验证码进行匹配
$("code").onblur = function() {
//获取输入项中的验证码
var inputCode = this.value;
//获取span标签随机生成保留的验证码
var spanCode = $("code_val").innerHTML;
if (!inputCode) {
alert('验证码不能为空');
return false;
} else {//编写了验证码
if (inputCode != spanCode) {
alert('验证码输入错误');
this.value = "";
//重新生成
return false;
}
}
return true;
};
//随机生成的验证码 有四个字母或者数字? 随机
//javascript 随机器 Math.random() 0-1之间
//生成一个0-9的随机数
/* var sj = Math.random()*10;
// 向下取整
console.log(Math.floor(sj)); */
setCode();
/* 如果span中存储的验证码不清晰 需要重新修改 设置span的点击事件 */
$("code_val").onclick = function() {
setCode();
}
};
//封装验证码生成
function setCode() {
//清空上一次保留的验证码
code = "";
//通过Math.random();产生一个随机数
for (var i = 0; i < 4; i++) {
/* 取范围 乘 数组的长度个数 */
var sj = Math.floor(Math.random() * arr.length);
//console.log(sj)
//console.log(arr[sj]); //根据随机数获取数组中的元素
code += arr[sj];
}
//获取存储验证码的span标签
$("code_val").innerHTML = code;
}
</script>
</head>
<body>
<!-- 登录大容器 -->
<div id="login">
<!-- 上 -->
<div id="top">
<div id="top_left">
<img src="images/login_03.gif" />
</div>
<div id="top_center"></div>
</div>
<!-- 中 -->
<div id="center">
<div id="center_left"></div>
<!-- 表单区域 -->
<div id="center_middle" style="background: pink">
<form id="myForm" action="doAdminLogin.jsp" method="post">
<div id="user">
用 户 <input type="text" id="username" name="username" />
</div>
<div id="pwd">
密 码 <input type="password" id="password" name="password" />
</div>
<!-- 登录前需要验证码进行验证 -->
<div id="yzm">
验证码 <input type="text" name="code" id="code" /><span
id="code_val">SBSB</span>
</div>
<!-- 区域留出来 7天免登录-->
<div id="mdl">
<label> <input type="checkbox" name="isCheck" value="auto">
</label> <label>一周内免登录</label>
</div>
<div id="btn">
<input type="submit" value="登录" /> <input type="reset" value="清空" />
</div>
</form>
</div>
<div id="center_right"></div>
</div>
<!-- 下 -->
<div id="down">
<div id="down_left">
<div id="inf">
<span class="inf_text">版本信息</span> <span class="copyright">管理信息系统
2008 v2.0</span>
</div>
</div>
<div id="down_center"></div>
</div>
</div>
</body>
</html>
实现以下效果:

在新闻发布系统中实现会话管理所有完整代码如下:
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//定义变量 保存登录的用户
String username = "";
//后台主页面获取到当前的Cookie对象中所保存的用户名
Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (Cookie cookie : cookies) {
if ("uname".equals(cookie.getName())) {
username = URLEncoder.encode(cookie.getValue(), "UTF-8");
break;
}
}
}
//判断:username为空 说明没有登录 cookie获取时 cookie.getValue不能赋值
if ("" == username) {//me米有登录
//送回去
response.sendRedirect("admin_login.jsp");
}
%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//该页面作用:根据request对象获取登录表单提交的值进行数据库交互
//1.设置编码
request.setCharacterEncoding("utf-8");
//2.获取表单提交的值
//用户名
String username = request.getParameter("username");
//密码
String password = request.getParameter("password");
//拿到复选框是否选中? 选中了 才能实现自动登录
String[] isChecks = request.getParameterValues("isCheck");
//只需要判断isChecks这个数组是否为空,就能证明是否选中了复选框
//System.out.println(isChecks);
//3.数据库交互
String uname = "";
String pwd = "";
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//建立连接
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
Connection conn = DriverManager.getConnection(url, "scott", "123");
//sql
String sql = "select * from tb_news_users where username = ? and password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
if (rs.next()) {//存在 就可以登录
uname = rs.getString(1);
pwd = rs.getString(2);
}
if ("" != uname && "" != pwd) {//数据库查到记录了
//判断如果选中了复选框 通过Cookie保存值
//创建Cookie
Cookie cookieUsername = new Cookie("uname", username);
if (null != isChecks) {//选中了复选框------一周内免登陆
//由于浏览器关闭后,会话中断,Cookie自动清除
//设置时长 秒
cookieUsername.setMaxAge(1 * 60 * 60 * 24 * 7);
}
//通过response响应对象写回客户端浏览器
response.addCookie(cookieUsername);
response.sendRedirect("admin.jsp");
} else {
//out.println(js)
response.sendRedirect("doAdminLogin.jsp");
}
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//退出登录 拿到当前的cookie进行重新保存 跳转到login.jsp
Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (Cookie cookie : cookies) {
if ("uname".equals(cookie.getName())) {
//失效 退出登录
cookie.setMaxAge(0);//设置时长
response.addCookie(cookie);
break;
}
}
}
//跳回登录页面
response.sendRedirect("admin_login.jsp");
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>后台-尾部封装页面</title>
</head>
<body>
<div id="site_link">
<a href="#">关于我们</a><span>|</span> <a href="#">Aboue Us</a><span>|</span>
<a href="#">联系我们</a><span>|</span> <a href="#">广告服务</a><span>|</span>
<a href="#">供稿服务</a><span>|</span> <a href="#">法律声明</a><span>|</span>
<a href="#">招聘信息</a><span>|</span> <a href="#">网站地图</a><span>|</span>
<a href="#">留言反馈</a>
</div>
<div id="footer">
<p class="">
24小时客户服务热线:010-68988888      <a href="#">常见问题解答</a>
     新闻热线:010-627488888<br />
文明办网文明上网举报电话:010-627488888      举报邮箱:<a href="#">jubao@jb-aptech.com.cn</a>
</p>
<p class="copyright">
Copyright © 1999-2009 News China gov, All Right Reserver<br />
新闻中国 版权所有
</p>
</div>
</body>
</html>