问题?在浏览相关网页登陆用户密码的时候,都会提示,是否记住当前用户名及密码提示。但是相关的代码怎么做呢?
一、原理:其实这其中主要用到了Cookie的应用,Cookie相当于一种标志或者是一种缓存,在当地浏览器中存在着, 当你记住密码的时候就会写入这个缓存或者标志。等你下载访问的时候就会提取出来放置在表单中。
二、定义:Cookie和HttpSession简介
Cookie是客户端技术
HttpSession是服务器端技术
三、ookie详细介绍
javax.servlet.http.Cookie
1、Cookie是什么?
一个小信息,由服务器写给浏览器的。由浏览器来保存。
客户端保存的Cookie信息,可以再次带给服务器。
2、Cookie的属性:
name:必须的
value:必须的
comment:可选的。注释
path:可选的。
写Cookie的程序的访问路径是:http://localhost:8080/day07/servlet/CookieDemo1
其中:localhost就是域名;/day07/servlet就是当前Cookie的path
访问的地址的URI.startWith(cookie的路径), 为true就带
比如IE存的cookie的路径是/day07
现在访问的地址是:http://localhost:8080/day07/servlet/CookieDemo1 带
现在访问的地址是:http://localhost:8080/day07/CookieDemo1 带
比如IE存的cookie的路径是/day07/servlet/
现在访问的地址是:http://localhost:8080/day07/servlet/CookieDemo1 带
现在访问的地址是:http://localhost:8080/day07/CookieDemo1 不带
如果一个Cookie的路径设置成了/day07,意味着什么?当前应用下的所有资源浏览器都会带着它给服务器。
domain:可选的。该Cookie所属的网站域名。(itcast.cn)默认值。
maximum age:可选的。不设置就是会话过程(存在浏览器的内存中)。单位是秒
如果是0,说明要删除。
version:可选的。
3、如何向客户端写Cookie:HttpServletResponse.addCookie(javax.servlet.http.Cookie)(就是写了一个响应消息头:Set-Cookie:cookie的信息)
特点:一个浏览器针对一个网站最多存20个Cookie;最多存300个Cookie,每个Cookie的长度不能超过4KB。(稀缺)
4、服务器如何得到客户端传来的Cookie。HttpServletRequest.getCookies()
5、如何区分Cookie:通过名称不行。根据name
domain+path+name来区分的。
如:localhost/day07/servlet/lastAccessTime
四、写一个Cookie案例:
1.记住用户最后一次的访问时间
2.记住用户登录时的用户名
3.电商网站:记住用户商品的历史浏览记录
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>day7</display-name>
<servlet>
<servlet-name>CookUserDom1</servlet-name>
<servlet-class>com.dp.java.Cookie.api.CookUserDom1</servlet-class>
</servlet>
<servlet>
<servlet-name>CookUserDom2</servlet-name>
<servlet-class>com.dp.java.Cookie.api.CookUserDom2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookUserDom1</servlet-name>
<url-pattern>/servlet/CookUserDom1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>CookUserDom2</servlet-name>
<url-pattern>/servlet/CookUserDom2</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>MyJsp1.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
JavaBean类文件
package com.dp.java.Cookie.api;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//根据字段生成它的构造方法
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {}
}
package com.dp.java.Cookie.api;
import java.util.ArrayList;
import java.util.List;
public class Userlist {
private static List<User> us=new ArrayList<User>();
//初始化
static{
us.add(new User("a1", "123456"));
us.add(new User("a2", "123456"));
us.add(new User("a3", "123456"));
}
public static User findUser(String username,String password){
User user=null;
for(User u:us){
if(username.equals(u.getUsername())&&password.equals(u.getPassword())){
user=u;
break;
}
}
return user;
}
}
用户登录页面的设计(这里直接用servlet实现的,没有jsp文件或者html文件,但是原理是相同的)
package com.dp.java.Cookie.api;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookUserDom1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//读取记住的用户名,如果没有不会显示
String username="";
String checked="";
Cookie cs[]=request.getCookies();
for(int i=0;cs!=null&&i<cs.length;i++){
Cookie c=cs[i];
if("userInfo".equals(c.getName())){
String value=c.getValue();
username=value;
checked="checked='checked'";
break;
}
}
//提供登陆页面
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
//用户名不要存中文,因为Cookie存不了中文格式
out.write("<form action='/day7/servlet/CookUserDom2' method='post'><br>");
out.write("用 户 名:<input type='text' name='username' value=''><br>");
out.write("密 码:<input type='password' name='password' value=''><br>");
out.write("记住密码:<input type='checkbox' name='gen'><br>");
out.write("<input type='submit' value='提交'>");
out.write("</form>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
用户名和密码的处理及Cookie处理
package com.dp.java.Cookie.api;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//完成登陆
//根据是否需要记住用户密码来写Cookie
public class CookUserDom2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
String username=request.getParameter("username");
String password=request.getParameter("password");
String rember=request.getParameter("gen");
//验证
User user=Userlist.findUser(username, password);
if(user==null){
out.write("错误的用户和密码");
return;
}
//处理Cookie: name:userInfo(即Cookie测名字)
Cookie c=new Cookie("userInfo", username);
c.setPath(request.getContextPath());
if(rember==null){
//删除Cookie
c.setMaxAge(0);
}else{
//记住Cookie
c.setMaxAge(60*60);//只保存一分钟
}
response.addCookie(c);//写回Cookie
out.print("登陆成功!!!<a href='/day7/servlet/CookUserDom1'>返回登陆页面</a>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
记得访问第一个/servlet/CookUserDom1喔!!
五、各种URL地址的写法
相对路径
绝对路径:(建议的)
绝对路径怎么写?什么时候需要加上应用名称"/day07"?
注:原则:地址是不是给服务器用的,如果是,"/"就代表着当前应用。如果是给客户端用的“绝对路径”要
加上应用名称。
<link href=path/>
要加/day07(客户端行为)(绝对路径)
<script src=path/>
要加/day07(客户端行为)((绝对路径)
<img src=path/>
要加/day07(客户端行为)((绝对路径)
<a href=path/>
要加/day07(客户端行为)((绝对路径)
RequestDispatcher.include(path)
不要加,"/"就代表着当前应用(服务器行为)
RequestDispatcher.forward(path)
不要加,"/"就代表着当前应用(服务器行为)
HttpServletResponse.sendRedirect(path)
要加/day07(客户端行为)(绝对路径)
ServletContext.getRealPath(path)
不要加,"/"就代表着当前应用(服务器行为)