三:Session和cookie部分

Cookie在客户端,session在服务器端,cookie的功能 需要浏览器支持。

通过request,getCookie()获取客户端提交的所有cookie,以数组的形式返回。

通过response.addCookie(Cookie cookie)向客户端设置cookie.

记录用户访问次数

<%@ pagelanguage="java" pageEncoding="utf-8"errorPage="login.jsp"%>
<%
request.setCharacterEncoding("utf-8");
stringusername="";
intvisitTimes=0;
Cookie[]cookies=request.getCookies();
for(inti=0;cookies!=null && i<cookies.length;i++)
{
 Cookie cookie=cookies[i];
if(cookie.getName=="username")
{
username=cookie.getValue();
}elseif(cookie.getName=="visitTimes")
{
visitTimes=Integer.parseInt(cookie.getValue());
}
}
 
if(username==null|| username.trim().equals(""))
{
throw newException("你还未登陆,请登录!");
}
visitTimes ++;
Cookie visitCookie=newCookie("visitTimes",visitTimes.toString());
response.addCookie(visitCookie);
%>

Unicode中文编码

记录访问次数

<%@ pagelanguage="java" pageEncoding="utf-8"isErrorPage="true"%>
<%
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
if(request.getMethod()== "POST")
{
CookieusernameCookie=newCookie("username",request.getParameter("username"));
CookievisitCookie=new Cookie("visitTimes","0");
response.addCookie(usernameCookie);
response.addCookie(visitCookie);
response.sendRedirect(request.getContextPath()+"/cookie.jsp");
return;
}
%>
 
<span><%=exception.getMessage()%></span>
<inputtype="button" class="button" onClick="location='<%=request.getRequestURI()%>?ts='new Date().getTime();"  value="刷新"/>

保存二进制图片

1.先将二进制数据写进客户端cookie

<%@page language=”java”pageEncoding=”utf-8”%>
<jsp:directive.page  import=”sun.misc.BASE64Encoder”/>
<jsp:directive.page  import=”java.io.InputStream”/>
<jsp:directive.page  import=”java.io.File”/>
<%
File file=new File(this.getServletContext().getRealPath(“a.gif”));/*图片在根目录下 this.getServletContext().getRealPath("") ;获取web站点在硬盘中的绝对路径
this.getServletConfig().getInitParameter("action");获取web.xml文件中名称为“action”的参数值*/

Byte[] binary=new byte[(int)file.length()];//二进制数组
 
//从图片文件读取二进制数据
 
inputStream ins=this.getServletContext().getResourceAsStream(file.getName);
 
ins.read(binary)//把二进制数据放进数组中去
 
ins.close();
 
string content=BASE64Encoder.class.newInstance().encode(binnary)//对binnary进行编码
 
Cookie cookie=new Cookie(“file”,content);//包含二进制数据的cookie
 
Response.addCookie(cookie);将cookie发送到客户端
 
%>

2.将cookie中的二进制数据显示并还原,解码并显示图片代码如下:

<%@page language=”java”pageEncoding=”utf-8”%>
<jsp:directive.page  import=”sun.misc.BASE64Encoder”/>
<jsp:directive.page  trimDirectiveWhitespaces=”true”/>/* 删除在jsp最终输出的html中会产生大量的空行

最快的解决办法是在web.xml中配置:

<jsp-property-group> 
       <url-pattern>*.jsp</url-pattern> 
       <trim-directive-whitespaces>true </trim-directive-whitespaces> 
 </jsp-property-group> */<%

Out.clear();//清除输出

For(Cookiecookie :request.getCookies())//遍历cookie
{
   If(cokie.getName.equals(“file”))//找到名为file的cookie
{
byte[]binary=BASE64Encoder.class.newInstance().decodeBuffer(cookie.getValue().replace("",""));
response.setHeader("Content-Type","image/gif");
response.setHeader("Content-Disposition","inline;filename=cookie.gif");
response.setHeader("Connection","clise");
response.setContentLength(binary.lentgh);
response.getoutputStream().write(binary);
response.getoutputStream().flush();
response.getoutputStream().close();
return;*/
}
}

注释:

/* Content-Type的作用

该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。

Content-Disposition 的作用

当Content-Type的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。

1.        response.setHeader("Content-Type","video/x-msvideo"); 

2.         

3.                      response.setHeader("Content-Disposition", "attachment;filename=aaa.doc");

 上例子中解决下载中文乱码问题

response.setHeader()下载中文文件名乱码问题

response.setHeader("Content-Disposition","attachment; filename=" + java.net.URLEncoder.encode(fileName,"UTF-8"));

Cookie的常用属性

(1)    设置了cookie的失效时间后,在有效时间内,无论用户是关电脑还是浏览器,登录网站时该cookie扔有效。该cookie被持久化,写入到了cookie文件中。(2)若maxAge为负数,则表示该cookie仅在本浏览器窗口及其子窗口内有效,关闭窗口该cookie失效,为临时性cookie,不会写到cookie文件中,cookie保存在浏览器内存中去,关闭浏览器即失效了。(3)若macAge为0.则表示删除该cookie,失效的cookie会从浏览器内存或者cookie文件中删除。

 

Domain属性必须以.开始,表示可以访问cookie的域名。

Path属性表示可以访问的路径。

http协议是无状态的,不安全的。可以设置cookie的secure属性为true,浏览器就只会在https和ssl等安全协议中传输此类cookie。

js操作和获取cookie

 

Session在用户第一次访问服务器的时候创建,只有在访问jsp,servlet时才会生成session.,在html  image中不会生成。

Session常用属性

url地址重写是对客户端不支持cookie的解决方案。url地址重写的原理是将该用户session的id信息重写到url地址中,服务器能够解析重写后的url获取session的id,这样即使客户端不支持cookie,也可以使用session来记录用户状态。Encoderurl(string url)实现url地址的重写。

Session和cookie的区别:

1.    在存取方式上:cookie只能保存ascii字符串,不能直接存取java对象,若要进行二进制数据的读取,需要进行base64编码等。而session可以存取任何类型的数据。

2.    在安全性上,cookie存储在客户端,对用户是可见的,不安全的。Session存储在服务器端,对用户是透明的。

3.    在有效期上,cookie的有效期比session长。

4.    Session对服务器的负担比较重。

5.    在浏览器支持上,若浏览器禁用了cookie,则会话跟踪失效。可以进行session,以及url地址重写。Session依赖于名为jsessionid的cookie。

6.    在跨域名上,cookie支持跨域名访问,session不支持。