会话

  什么是会话?
    会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
    会话是访问特定web站点时用户执行的一组活动,记住不同会话过程称为会话跟踪。
  会话过程中要解决的一些问题?
    每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。
    例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐。


  Cookie
    Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这 样, web资源处理的就是用户各自的数据了。

Session
    Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

会话:当访问web资源之后,通过连接继续请求当前站点的资源,然后关闭浏览器的整个过程。
会话技术:cookie、session
cookie:将服务器的数据保存到浏览器端的技术
  要求保存数据:服务器
  保存数据:浏览器
    IE;将cookie保存到指定目录中,以文件的形式存储
    火狐或谷歌:将cookie保存到指定的文件中
  使用HTTP协议进行通信
会话级cookie:当整个会话结束后,cookie信息将被删除(cookie在内存中)
持久化cookie:将cookie保存到硬盘中
    setMaxAge
    单位:秒
    如果设置的值为零,则进行删除操作。
request.getCookies();获得当前web项目的所有的cookie信息
  获得当前浏览器中的cookie
  获得当前servlet所在目录,以及之上的所有目录下的cookie信息
  通过setPath可以设置cookie的访问路径
  在cookie中存放中文
    编码:String returnData = URLEncoder.encode(data, "UTF-8");
    解码:String value = URLDecoder.decode(c.getValue(), "UTF-8");

package cn.itcast.cookie;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

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 CnCookieServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //String[]  -- byte[]
        //"中文".getBytes("UTF-8") -- byte[] -- > 12,45,67,98
        //12,45,67,98  --> String[] -- byte[]  -- new String()
        
        
        
        //读取cookie
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for(Cookie c : cookies){
                System.out.println(c.getName() + ":" + c.getValue());
                //获得cn的值,然后解码
                if("cn".equals(c.getName())){
                    String value = URLDecoder.decode(c.getValue(), "UTF-8");
                    System.out.println(value);
                }
            }
        }
        
        
        String data = "中文";
        String returnData  = URLEncoder.encode(data, "UTF-8");  //base64
        
        Cookie cookie = new Cookie("cn",returnData);
        
        response.addCookie(cookie);
        
        

    }

}



    cookie的value可以设置多少个字符:4kb
session:服务器在服务器端创建一个内存区域,用来存放当前用户的所有信息,通过cookie关联。
  前提:必须使用cookie
  session:
    tomcat创建
      销毁:30分钟
 URL重写
   一般情况选择encodeURL
  两个方法区别在于,如果参数为空字符串,返回结果不同。
public String encodeURL(String url) {

String absolute = toAbsolute(url);
if (isEncodeable(absolute)) {
// W3c spec clearly said
if (url.equalsIgnoreCase("")){ //
url = absolute;
}
return (toEncoded(url, request.getSessionInternal().getIdInternal()));
} else {
return (url);
}

}

public String encodeRedirectURL(String url) {

if (isEncodeable(toAbsolute(url))) {
return (toEncoded(url, request.getSessionInternal().getIdInternal()));
} else {
return (url);
}

}
注意:参数url必须有效,否则返回没有改变的URL
当使用"/"开头,相对于web站点
response.encodeURL("/day07/urlSessionServlet2")
/day07/urlSessionServlet2;jsessionid=F85DB5EFDDB9A6B170AF2B4959EFC4FC
获得Web的绝对路径
String absolute = toAbsolute(url);
http://localhost:8080/day07/
总结:
需要考虑用户的Cookie是否禁用了
将所有的链接全部进行URL重写(过滤器)

原文地址:https://www.cnblogs.com/xuyatao/p/6652181.html