Servlet - 会话

servletRequest、servletRespones作用于链接

servletContext作用于全局

 

Cookie客户端技术,大家都知道的。

Session服务器端技术--为每一个客户端创造一个独享的Session对象

 

Session

20110607-截图 1

关键点是,在getSession时,如果不存在当前会话,会自动创建,以后再getSession的时候,用的就是这个了。

 

Cookie

response.addCookie(),为会话加入一个cookie;

request.getCookies(),获取当前会话的cookies;

Cookie.setMaxAge(),设置生存周期,默认值为浏览器页面时间

Cookie.setPath(),设置有效目录,默认值为当前程序所在目录

Cookie.setDomian,设置域,例如(.sina.com.cn),记得前面加点(.)。浏览器一般会禁止写入第三方域。

 

example:

显示用户上次访问时间示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public void doGet(.....){
     
    //解决乱码
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
 
    //获得一个writer
    PrintWriter out=response.getWriter();
 
    out.write("上次访问时间");
 
    //获得cookies
    Cookie cookies[]=request.getCookies();
    //遍历所有cookie并进行非空判断
    for(int i=0;cookies!=null && i<cookies.length;i++){
 
        Cookie cookie=cookies[i];
 
        //取得存取最后访问时间的cookie
        if(cookie.getName().equals("lastAccessTime")){
 
            //取得cookie值
            String value=cookie.getValue();
            //将毫秒时间转换格式化
            Date d=new Date(Long.parseLong(value));
 
            out.writer(d.toLocaleString());
    }
 
    //更新cookie的最后访问时间
    Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMills()+"");
 
    //设置cookie存活时间,这里是一周。
    cookie.setMaxAge(60*60*24*7);
 
    //设置cookie目录,只要访问当前目录下,无论存不存在页面,都会携带此cookie访问
    cookie.setPath("/***");
 
    //写入这个cookie
    response.addCookie(cookie);
 
 
}

 

注意,浏览器一般只允许存放300个Cookie,每个站点最多20个,每个Cookie最大4kb。

 

example:

删除cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void doGet(.....){
 
    //首先新建一个cookie,名称为要删除cookie的名字   
    Cookie cookie=new Cookie("lastAccessTime","");
 
    //将存活时间设置为0
    cookie.setMaxAge(0);
 
    //访问目录要与目标cookie一样
    cookie.setPath("/***");
     
    //写入cookie,就会替换原始cookie,并删除
    response.addCookie(cookie);
}

 

判断表单重复提交的事例:

判断重复提交的流程,一般是这样的,在提交的表单中,加入一个随机数,提交表单的时候,一起提交,然后与服务器端session中的随机数(令牌)对比,如果存在,则提交,并且从session中删除这个令牌(随机数)。如果重复提交,提交的随机数与session中无法匹配,则对提交内容不作处理。

 

一个通用的令牌生成关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class TokenProcessor{  //令牌
    /*
     * 1.把构造方法私有
     * 2.自己创建一个
     * 3.对外暴露一个方法,允许获取上面创建的对象
     */
     
    private TokenProcessor(){}
    private static final TokenProcessor instance = new TokenProcessor();
     
    public static TokenProcessor getInstance(){
        return instance;
    }
     
     
    public String generateToken(){
         
        //这样获得的随机数长短不一
        String token = System.currentTimeMillis() + new Random().nextInt() + "";
         
        try {
            //所以,对他们进行一次md5,取得固定长度的摘要
            MessageDigest md = MessageDigest.getInstance("md5");
            byte[] md5 = md.digest(token.getBytes());
             
            //base64编码,这样做的目的是,避免字节码偶然出现通讯中的结束位,误判断并提前结束传输
            //base64是每6位前补00,形成一个字节,然后根据码表转换为键盘上的可见字符。
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(md5);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
     
}

posted on   黑暗伯爵  阅读(474)  评论(3编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2011年6月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9

统计

点击右上角即可分享
微信分享提示