cookie技术:
在javax.servlet.http包下有个名为Cookie的类,通过该类就可以向客户端设置cookie数据了。
cookie的创建:
package cookie; import java.io.IOException; 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 cookie extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建两个Cookie: //import javax.servlet.http.Cookie 导的是这个包 //他就是以键 - 值得形式存在的啊 Cookie cookie_1 = new Cookie("user", "bihu"); Cookie cookie_2 = new Cookie("pass","a123456"); //生成好了 接下来绑定到响应体中: response.addCookie(cookie_1); response.addCookie(cookie_2); //这样的话 用户GET请求页面 那么就会使用这两个Cookie!! } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
那么问题来了 ,我们可以在浏览器看到:
不仅仅内容是显示在外头 而且 到期时间也仅关闭窗口,我们还可以看到 还有路径,那么我们该学会如何去保护这些 和 设置这些:
设置绑定路径
默认绑定:
就是上面代码中的单纯设置Cookie 那么他会默认绑定路径,也就是途中看到的 /Cookie 如果你以后访问任何一个 : http://localhost:8080/Cookie/XXX,都会携带刚生成的Cookie,这就是默认绑定。
自定义绑定:
cookie除了默认绑定之外我们还可以手动设置其绑定路径:
具体看代码函数:
package cookie; import java.io.IOException; 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 cookie extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建两个Cookie: //import javax.servlet.http.Cookie 导的是这个包 //他就是以键 - 值得形式存在的啊 Cookie cookie_1 = new Cookie("user", "bihu"); Cookie cookie_2 = new Cookie("pass","a123456"); //为Cookie绑定路径 你可以分开绑定 自定义的 System.out.println(request.getContextPath()); cookie_1.setPath(request.getContextPath() + "/bihu"); cookie_2.setPath(request.getContextPath() + "/bihu"); //生成好了 接下来绑定到响应体中: response.addCookie(cookie_1); response.addCookie(cookie_2); //这样的话 用户GET请求http://localhost:8080/Cookie/bihu/XXX页面 那么就会使用这两个Cookie!! 完全自定义的 } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
其中 request.getContextPath(),返回当前页面所在的应用的名字,还有就是 默认的页面也可以用Cookie 我不知道为什么 但是其他不能,就是说 你绑定了路劲后,
你访问的URL必须包含 : xxxxx:8080:/ 你绑定的路劲 / 你绑定的路劲 / XXX;
才有效 你自己可以用浏览器试试 或者 你用Fidder去抓包
设置cookie的有效时长
默认情况下, Cookie 是保存在浏览器的缓存中的,关闭浏览器后Cookie也就消失了。
开发者可以通过设置Cookie的有效时长,将Cookie写入到客户端硬盘文件中。
可以通过下面的方法设置有效时长
public void setMaxAge(int expiry)
其中expiry的单位为秒,整型。
参数取值特性:
- 大于 0,则表示要将 Cookie 写入到硬盘文件中;
- 小于 0,则表示 Cookie 存放在浏览器缓存中,与不设置时长等效;
- 等于 0,则表示 Cookie产生后直接失效。
注意可以设置cookie的值 ,用 Cookie 类中的 setvalue
也可以重复添加cookie,但会替代之前的。
代码:
package cookie; import java.io.IOException; 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 cookie extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建两个Cookie: //import javax.servlet.http.Cookie 导的是这个包 //他就是以键 - 值得形式存在的啊 Cookie cookie_1 = new Cookie("user", "bihu"); Cookie cookie_2 = new Cookie("pass","a123456"); //设置cookie的有效时长: //public void setMaxAge(int expiry) 方法: /* * 大于 0,则表示要将 Cookie 写入到硬盘文件中; *小于 0,则表示 Cookie 存放在浏览器缓存中,与不设置时长等效; *等于 0,则表示 Cookie产生后直接失效。 */ cookie_1.setMaxAge(60 * 60 * 24 * 15); // 60 * 60 * 24 * 15 就是15天 注意的是 别设置几秒或几千秒 没用的啊 浏览器他不会计算的 cookie_2.setMaxAge(60 * 60 * 24 * 15); //生成好了 接下来绑定到响应体中: response.addCookie(cookie_1); response.addCookie(cookie_2); //这样的话 用户GET请求http://localhost:8080/Cookie/bihu/XXX页面 那么就会使用这两个Cookie!! 完全自定义的 } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
设置路径 和 日期我都讲了啊 至于加密 你自己去加密 但推荐Cookie别带中文!!!!
接下来我们学习如何获取啊 获取Cookie:
服务器端获取请求的cookie
在 HttpServletRequest 中有一个方法getCookies(),专门用于读取请求中所携带的 Cookie 数据,该方法的返回值类型是Cookie数组。
比如:携带cookie时即可访问 但是注意的是:没cookie时你别去获取 ,不然cookie 会为空 ,会空指针异常:
代码:
package Accept; import java.io.IOException; 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 AcceptCookie extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //注意!确保访问AcceptCookie时 浏览器是携带者Cokkie的 不然为空的话会报空指针异常!! //用HttpServletRequest类种的 getCookies 方法来获取Cookie对象数组 Cookie[] mCookie = request.getCookies(); //获取好了 我们来遍历一下获取到的 Cookie: for(Cookie c : mCookie) { System.out.println("Cookie Name :" + c.getName()); System.out.println("Cookie Velue :" + c.getValue()); System.out.println("Cookie Time :" + c.getMaxAge() + " S"); System.out.println("Cookie Domain :" + c.getDomain()); //获取域 System.out.println("Cookie Path :" + c.getPath()); //获取路径 System.out.println("---------------------------------"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
我们打印下遍历结果: 都很准确的啊 更多的自己百度即可:
Cookie Name :user
Cookie Velue :bihu
Cookie Time :-1 S
Cookie Domain :null
Cookie Path :null
---------------------------------
Cookie Name :pass
Cookie Velue :a123456
Cookie Time :-1 S
Cookie Domain :null
Cookie Path :null
---------------------------------
练习