javaweb 第二天
Cookie 的使用入门
Cookie 技术能将服务器端的一些数据保存在用户使用的客户端计算机中。这样一来,用户下次就可以直接通过自己的计算机访问到该数据,而不必再访问服务器。
- 在项目
JspProject中创建服务端response_addCookie.jsp并写入以下代码:
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>服务端</title>
</head>
<body>
<%
// 创建2个Cookie对象
Cookie c1 = new Cookie("bookName","BlueBridge");
Cookie c2 = new Cookie("author","yamiya");
// 通过addCookie()方法,将Cookie对象设置到客户端
response.addCookie(c1);
response.addCookie(c2);
response.sendRedirect("temp.jsp");
%>
</body>
</html>
- 创建客户端 temp.jsp,并写入以下代码。
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>客户端</title>
</head>
<body>
<a href="request_getCookies.jsp">客户端再次跳转</a>
</body>
</html>
- 创建服务端 request_getCookies.jsp。
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>客户端</title>
</head>
<body>
<%
// 通过request对象获取全部的Cookie对象
Cookie[] cookies = request.getCookies();
for(int i=0 ; i< cookies.length ; i++)
{
// 输出Cookie对象名和对象值
out.print(cookies[i].getName()+"--"+cookies[i].getValue()+"<br/>");
}
%>
</body>
</html>
- 先执行
response_addCookie.jsp,并在跳转后的页面temp.jsp里单击超链接,得到以下运行结果:(张三是另外应该实验的)可以发现,
temp.jsp中的超链接并没有携带任何参数,但跳转后的客户端request_getCookies.jsp页面却依然能获取到 Cookie 对象。这是因为,在temp.jsp页面中客户端得到的 Cookie 信息在点击超链接的过程中包含在HTTP请求头中传递到了request_getCookies.jsp。在客户端发送的请求中(超链接请求、表单请求等)可以包含非常丰富的内容,除了可以携带 URL 参数、表单数据外,还可以传递丰富的请求头信息,我们可以在浏览器中按 F12 可以查看
可以发现,请求头信息中包含着多个 Cookie 对象,每个 Cookie 对象都是以“键=值”的形式存在的,并且键为 JSESSIONID 的 Cookie 对象是由服务器自动产生的。
实际上,在客户端每次访问服务器时,服务器为了区分各个不同的客户端,就会自动在每个客户端的 Cookie 里设置一个 JSESSIONID,表示该客户端的唯一标识符。
实验:通过cookie实现记住用户名字
- 在项目中新建登录页
login_cookie.jsp,并写入以下代码。
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>登陆页面</title>
</head>
<body>
<%!
String username ;
%>
<%
Cookie[] cookies = request.getCookies() ;
// 判断是否存在键为"username"的Cookie,若存在则获取该Cookie的值
for(Cookie cookie:cookies)
{
if(cookie.getName().equals("username"))
{
username = cookie.getValue();
}
}
%>
<form action="check_cookie.jsp" method="post" >
用户名:<input type="text" name="uname" value=
"<%=username==null ? "":username %>" /> <br/>
密码:<input type="password" name="upwd" /><br/>
<input type="submit" value="登录" />
</form>
</body>
</html>
- 新建登陆验证页面
check_cookie.jsp,写入以下代码。
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>cookie</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("uname");
// 将用户名保存在键为"username"的Cookie对象中
Cookie cookie = new Cookie("username",name);
response.addCookie(cookie);
// 登录验证...
%>
</body>
</html>
程序运行结果如下图所示。
第一次访问登录页 login_cookie.jsp 时,先输入用户名 张三 及密码并点击登录,之后如果再次访问登录页 login_cookie.jsp,就会看到页面已经保存了用户名,如下图所示。
有可能没用Cookie也可以保存,这个是浏览器特性。
Cookie 的有效期
Cookie 在客户端保存的时间不是永久性的,它是有生命周期的,但可以通过 setMaxAge(int expiry) 方法或 web.xml 设置 Cookie 的有效期。本次实验通过案例来演示如何通过 setMaxAge(int expiry) 方法设置 Cookie 的有效期。
使用 setMaxAge(); 方法设置 Cookie 对象的有效期时,单位是秒。例如以下代码,首先通过 cookieExpiry.jsp 页面设置一个 Cookie 对象,然后再尝试通过 cookieExpiryResult.jsp 页面来获取该 Cookie 对象。
创建 cookieExpiry.jsp,写入以下代码:
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>cookie设置</title>
</head>
<body>
<%
Cookie cookie = new Cookie("username","zhangSan");
// 设置Cookie对象的有效期为60秒
cookie.setMaxAge(60);
response.addCookie(cookie);
%>
</body>
</html>
创建 cookieExpiryResult.jsp,写入以下代码:
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>cookie到期</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
boolean flag = false;// 用来标识名为"username"的cookie是否存在
if(cookies != null)
{
for(int i=0 ; i<cookies.length; i++)
{
if(cookies[i].getName().equals("username"))
{
out.print("username:"+cookies[i].getValue());
flag = true ;
}
}
}
//如果名为"username"的cookie不存在
if(!flag)
{
out.print("Cookie已消失!");
}
%>
</body>
</html>
首先执行 cookieExpiry.jsp 来设置 Cookie 对象,如果在 60 秒以内运行 cookieExpiryResult.jsp,则运行结果如下图所示。
如果超过 60 秒以后,再次运行 cookieExpiryResult.jsp,运行结果如下图所示。
session 的常用方法
session 内置对象是 javax.servlet.ServletContext.HttpSession 接口的实例化对象,常用方法如表所示。
| 方 法 | 简 介 |
|---|---|
| public String getId() | 获取 sessionId |
| public boolean isNew() | 判断是否是新的 session(新用户) |
| public void invalidate() | 使 session 失效 |
| public void setAttribute(String name, Object value) | 设置 session 对象名和对象值 |
| public Object getAttribute(String name) | 根据 session 对象名,获取 session 对象值 |
| public void setMaxInactiveInterval(int interval) | 设置 session 的有效非活动时间, 单位是秒 |
| public int getMaxInactiveInterval() | 获取 session 的有效非活动时间,单位是秒 |
下面是使用 session 的一个具体示例。
- 先在服务器通过
createSession.jsp页面设置一个 session 值。
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>cookie到期</title>
</head>
<body>
<%
// session是内置对象,因此可以直接使用,而不用自己去创建
session.setAttribute("school","BlueBridge");
response.sendRedirect("createSessionResult.jsp");
%>
</body>
</html>
- 然后响应给客户端页面
createSessionResult.jsp。
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>cookie到期</title>
</head>
<body>
<%
// 获取session的值
out.print("sessionId:"+session.getId()+"<br/>");
Cookie[] cookies = request.getCookies();
// 前面学Cookie时已经知道,Cookie中会默认保存一个jsessionId的名和值
// 获取Cookie中jsessionId的名和值
out.print(cookies[0].getName()+"---"+cookies[0].getValue());
%>
</body>
</html>
- 执行
createSession.jsp,运行结果如下图所示。
由图可以发现,服务器中 session 对象产生的 sessionId 值,与客户端中 Cookie 对象产生的 jsessionId 值的内容是一样的,在实际开发中 cookie 对象和 session 对象通常是一一对应的,并且可以通过 sessionId 和 jsessionId 对应起来。
实验:使用 session 实现登录注销
实现思路:用户首先进行登录操作,如果登录成功,则将用户的登录信息保存在一个 session 范围的属性里。当用户再访问其他页面时,先在 session 范围内寻找是否存在用户的登录信息;若存在,则表示是已经合法登录过的用户;若不存在,则表示该用户尚未登录,从而直接跳转到登录页面,要求用户重新登录。若用户登录成功,还可以进行注销操作。登录流程如图所示。
登录页 loginDemo/login.jsp: 使用 form 表单录入用户名(uname)和密码(upwd)。
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>登陆页面</title>
</head>
<body>
<form action="check.jsp" method="post" >
用户名:<input type="text" name="uname"/> <br/>
密码:<input type="password" name="upwd" /><br/>
<input type="submit" value="登录" />
</form>
</body>
</html>
登录判断页 loginDemo/check.jsp:
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>登陆判断</title>
</head>
<body>
<%
// 将post请求方式的编码设置为UTF-8
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
// 假设用户名是zhangsan,密码是abc
if (name.equals("zhangsan") && pwd.equals("abc")){
// 登录成功后,将用户信息保存在session的作用域内
session.setAttribute("loginName", name);
// 设置session的非活动时间为10分钟
session.setMaxInactiveInterval(60 * 10);
// 将请求信息,转发到welcome.jsp页
request.getRequestDispatcher("welcome.jsp").forward(request, response);
}else{
// 若登录失败,返回登录页login.jsp
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
登录成功后的欢迎页 loginDemo/welcome.jsp:
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>欢迎你</title>
</head>
<body>
<%
// 进入welcome.jsp页面前,先通过session的作用域内判断用户是否已经登录
// 如果还没登录,则跳到登录页
String loginName = (String) session.getAttribute("loginName");
if (loginName == null)
{
// 用户还没登录
response.sendRedirect("login.jsp");
}else
{
out.print("登录成功!欢迎您<strong>" + loginName + "</strong><br/>");
out.print("<a href='logout.jsp'>注销</a>");
}
%>
</body>
</html>
注销页 logout.jsp:
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>注销</title>
</head>
<body>
<%
// 进入logout.jsp页面前,先通过session的作用域内判断用户是否已经登录
// 如果还没登录,则跳到登录页
String loginName = (String) session.getAttribute("loginName");
if (loginName == null)
{
// 用户还没登录
response.sendRedirect("login.jsp");
}else
{
// 使session范围中的属性全部销毁,即清除之前session中的loginName属性
session.invalidate();
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
可以发现,如果输入正确的用户名和密码,则直接跳转到欢迎页,如下图所示。
如果用户名或密码输入有误,则返回登录页。而且如果用户没有登录,则直接访问 welcome.jsp 或 logout.jsp,也会因为 session 作用域中的 loginName 为 null 而直接跳转返回登录页,从而实现访问权限的控制。
最后,再说明一下 Cookie 和 session 的几点区别,如下表所示。
| Cookie | session | |
|---|---|---|
| 保存信息的位置 | 客户端 | 服务器端 |
| 保存的内容 | 字符串 | 对象 |
| 安全性 | 不安全 | 安全 |
JSP 内置对象:application
application 对象是 javax.servlet.ServletContext 接口的实例化对象,代表了整个 Web 项目,所以 application 对象的数据可以在整个 Web 项目中共享,用法上类似于“全局变量”的概念
application 对象的常用方法如下表所示:
| 方 法 | 简 介 |
|---|---|
| public String getContextPath() | 获取虚拟路径(默认是项目名称)。 |
| public String getRealPath(String path) | 获取虚拟路径对应的绝对路径。 |
- 创建
applicationDemo.jsp文件,并写入以下代码。
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>application</title>
</head>
<body>
<%
String realPath = application.getRealPath("/");
String contextPath = application.getContextPath();
out.print("realPath:"+realPath+"<br/>");
out.print("contextPath:"+contextPath);
%>
</body>
</html>
重启 Tomcat,在地址栏的末尾加上 /JspProject/src/main/webapp/applicationDemo.jsp 得到以下运行结果。
可以发现,虚拟路径是项目名;而虚拟路径对应的绝对路径,是在工作目录中的某一个文件夹。默认情况下,Tomcat 会将虚拟路径设置成 webapps目录,但是,如果将所有的Web项目都放在webapps里也是不合理的。要想把Web项目放置到webapps以外的目录并能被Tomcat识别,就必须配置。通常,可以通过配置 Tomcat 中 server.xml 的 Host 元素进行虚拟路径的配置,如下,docBase 指定本地磁盘上的普通目录;path 指定 Tomcat 访问时的虚拟目录,可以使用绝对路径或相对路径。换句话说,当用户访问path指定的虚拟目录( /JspProject )时,就会自动访问docBase指定的本地目录(\MyWebApps\JspProject)。
<Host appBase="webapps" autoDeploy="true" name="localhost" … >
<Context docBase="MyWebApps\JspProject" path="/JspProject" />
</Host>
总结:
输出:out.print(),<%=%>
开发套路:
1.建一个web项目
2.基本格式
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>标题名字</title>
</head>
<body>
前端代码,比如超链接,表单,标题等
<%
java代码,比如request获取页面元素之类
%>
</body>
</html>
3.一般登录页面,需要一个登录的jsp,在from表单里面跳转到检查页面,如果检查成功,转发或者重定向到成功页面,失败可以不处理,可以跳转登录页面,可以直接输出失败。
4.request通过setCharacterEncoding设置编码格式
通过getParamete(“name”)获取表单元素{ps:表单里面元素需要手动添加name,类似前端的id那种类似}
获取元素后,可以输出,也可以检查是不是和xx相同
5.
】通过response.sendRedirect("地址名字")转发到该地址
】通过request.getRequestDispatcher("地址名字").forward(request,response),重定向到地址
cookie(写在<%里面%>)
创建:
Cookie c1 = new Cookie键,值);
获取
Cookie[] cookies = request.getCookies();
for(int i=0 ; i< cookies.length ; i++)
{
}
创建session:session.setAttribute(键,值);
session的值
out.print("sessionId:"+session.getId()+"
");
注销session:session.invalidate();