JSP_06
前言:JSP_05大概了解了cookie和session,现在开始实际应用。
一、回顾
加深对cookie和session的了解。
二、Cookie的使用
1、七天免登录
dologin.jsp
<%@page import="com.dao.impl.UserDao"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="java.net.URLDecoder"%>
<%@page import="oracle.jdbc.driver.OracleDriver"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<-- jsp标签 待会补充说明-->
<jsp:useBean id="u" class="com.entity.Users"></jsp:useBean>
<jsp:setProperty property="uname" name="u"/>
<jsp:setProperty property="pwd" name="u"/>
<%
//设置编码方式
request.setCharacterEncoding("UTF-8");
//获取表单信息
String name=u.getUname();
String pwd=u.getPwd();
//判断是否记住密码
String jzmm=request.getParameter("jzmm");
//如果登录验证成功
if(new UserDao().login(name, pwd)){
//为session添加一个值--对象u
session.setAttribute("user", u);
//创建cookie,以utf-8编码保存
Cookie c=new Cookie("uname",URLEncoder.encode(name,"utf-8"));
//设置保存时间7天
c.setMaxAge(60*60*24*7);
//响应给浏览器,保存到硬盘
response.addCookie(c);
//创建记住密码的cookie
Cookie c1=null;
if(jzmm!=null){
//如果记住密码保存用户密码
c1=new Cookie("upwd",URLEncoder.encode(pwd,"utf-8"));
}else{
//否则保存 ""
c1=new Cookie("upwd","");
}
c1.setMaxAge(60*60*24*7);
response.addCookie(c1);
//在线人数 application
//获得在线人数
Object count=application.getAttribute("online");
//如果不为空,在原来的基础上+1
if(count!=null){
application.setAttribute("online",((Integer)application.getAttribute("online"))+1);
}else{
//否则初始化application
application.setAttribute("online", 1);
}
response.sendRedirect("/Web_01/news/index.jsp");
}else{
out.print("<script>alert('登录失败');location.href='/Web_01/login.jsp'</script>");
}
%>
再看看登录界面login.jsp
<%
//用户不是第一次登录且保存的cookie没有到期,每次进来都可以拿到该页面的cookie
String name="";
String pwd="";
//通过request获得cookie
Cookie []cs=request.getCookies();
if(cs!=null){
for(Cookie c:cs){
if(c.getName().equals("uname")){
//utf-8解码赋值给name
name=URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("upwd")){
pwd=URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
//如果用户选择了记住了密码,即pwd不为 "",然后创建session并且自动登录
if(!pwd.equals("")){
session.setAttribute("username", name);
out.print("<script>alert('已自动登录');location.href='/Web_01/news/index.jsp'</script>");
}
%>
<-- 表单部分 将我们取到的cookie值赋值到输入框中 记住密码为复选框 使用了一个三元运算符
pwd==""?"":"checked" 如果密码不为空字符,就输出checked 默认复选框选中
-->
<form action="dologin.jsp" method="get" onsubmit="return checkForm()">
<div id="user"> 用 户
<input value="<%=name %>" id="a1" type="text" name="uname" />
</div>
<div id="password">密 码
<input value="<%=pwd %>" id="a2" type="password" name="pwd" />
</div>
<div id="yzm"> 验证码
<input id="a3" type="text" name="yzm" /><sapn id="a4">XXXX</sapn>
</div>
<div> 记住密码
<input <%=pwd==""?"":"checked" %> type="checkbox" name="jzmm" />
</div>
<div id="btn">
<button type="submit">登录</button>
<button type="reset">清空</button>
</div>
</form>
捋一下顺序,
首先是进入login.jsp,如果用户第一次访问,浏览器并未保存有他的cookie,为输入框赋值都为空字符,并没有记住密码的效果。
登录(请求仅携带保存了sessionid的cookie访问主界面)之后会由网络服务器产生cookie并响应给浏览器保存。中途会访问dologin.jsp,服务器编译dologin.jsp,在编译该句session.setAttribute("user", u);
时,服务器根据携带过来的sessionid找到对应session赋值。再创建cookie并响应给浏览器。之后进入主界面(访问主界面index.jsp),服务器编译index.jsp中该句<%=session.getAttribute("user")%>
时,也会根据请求带过来的sessionid觉得拿对应session取值。当session到期时,就会得到null,就让用户重新登录,重新建立联系。
下次该用户访问可以实现免登录了。
cookie是以明文保存的,所有用户密码应该经过不可逆加密算法加密
后保存为上策。
Java中自带一个包:security
分享我学习到的一个加密算法(来自一位博主)。我打开了源码进行翻译之后为大家写上了助于理解的注释。
•import java.security.MessageDigest;
//定义char数组
private static char[] hex={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/**
* 加密算法 将密码以以下运算符计算规律的加密
* @param bytes
* @return
*/
private static String byte2str(byte []bytes) {
int len=bytes.length;
StringBuffer result=new StringBuffer();
for (int i = 0; i < len; i++) {
byte byte0=bytes[i];
result.append(hex[byte0 >>> 4 & 0xf]);
result.append(hex[byte0 & 0xf]);
}
return result.toString();
}
/**
* 加密方法
* @param pwd 需要加密的密码
* @return 加密后的密码
*/
public String myMd5(String pwd) {
String str="";
try {
//创建指定算法的信息摘要对象
MessageDigest md5 =MessageDigest.getInstance("MD5");
//使用指定的字节数组(pwd)更新摘要 可以理解为为信息摘要对象的摘要赋值
md5.update(pwd.getBytes());
//md5.digest() 返回通过执行诸如填充之类的最终操作来完成哈希计算的哈希值的字节数组,然后更新摘要
//理解为将摘要进行计算后返回一个字节数组,再初始化摘要
//调用加密算法加密机
str=byte2str(md5.digest());
return str;
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
2、浏览记录
可以根据程序需求用cookie保存信息。
思路:用户执行某操作后使用cookie保存信息,需要时使用request取出对应cookie使用即可,可以自己尝试实现。
三、application应用级别对象
一个tomcat只有一个,值是全局共享的,整个tomcat都是一个application。可以用application来做在线人数
功能。dologin.jsp有使用。
四、jsp标签
1、6个常用jsp标签。
1.<jsp:include page="页面"> 包含
2.<jsp:param name="name" value="va"> 传参
3.<jsp:foward page="页面"> 转发
4.<jsp:useBean id="u" class="com.entity.Users">相当于实例化类
5.<jsp:setProperty property="uname" name="u"/>给useBean属性设置值
6.<jsp:getProperty property="uname" name="u"/>取值
注意:使用userBean时,class的格式要求
实践可得:setProperty的name要和实体类中的属性一致,应用到表单提交也要和表单中的input标签的name一致,否则取值为null或者报错。
在上面的cookie七天免登录中有使用到过。
<jsp:useBean id="u" class="com.entity.Users">等于Users u=new Users();
<jsp:setProperty property="uname" name="u"/>等于u.setUname("张三");
<jsp:getProperty property="uname" name="u"/>等于u.getUname();
2、jsp包含标签和包含指令的区别:
<%@include file="../yz.jsp"%>
:
-
不会对yz.jsp进行编译,运行之后可以在tomcat的work目录下查看是否有编译yz.jsp文件。
-
不能传参
<jsp:include page="页面">
-
会对页面进行编译
-
能传参
下面是一个分类实例:
type.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//设置编码方式
request.setCharacterEncoding("utf-8");
//获得类型id
String ntid=request.getParameter("ntid");
//里氏替换原则实例化UserBiz()
IUserBiz iub=new UserBiz();
//根据类别id查出新闻
List<News> li=iub.getByT(ntid);
//便利
if(li!=null){
%>
<h1> <img src="/Web_01/images/title_<%=ntid %>.gif" /> </h1>
<div class="side_list">
<ul>
<%
for(News n:li){
%>
<li> <a href='/Web_01/news/read.jsp?nid=<%=n.getNid() %>'><b><%=n.getNtitle() %> </b></a> </li>
<%
}
}
%>
</ul>
</div>
index.jsp
<div class="sidebar">
<jsp:include page="type.jsp">
<jsp:param value="1" name="ntid"/>
</jsp:include>
<jsp:include page="type.jsp">
<jsp:param value="2" name="ntid"/>
</jsp:include>
<jsp:include page="type.jsp">
<jsp:param value="3" name="ntid"/>
</jsp:include>
</div>
如果不使用包含标签是不是要在主界面进行三次便利集合,操作麻烦。而这里仅仅使用标签即可,标签上的type.jsp会进行编译。效果如下
五、总结
加深理解了cookie和session的区别和使用。理论知识助于理解,动手敲才是真理。住大家学业有成,工作顺利!!!