ThreadLocal的应用

文章目录

摘要

ThreadLocal的应用,登陆后保存登陆的用户信息。

一、实现

package com.mtons.mblog.util;

import java.util.Date;

/**
 * dotnet写入登录session的ticket User: bjzhyb Date: 2010-6-14 Time: 21:16:58
 * 
 * port from com.jd.common.struts.interceptor.dotnet.FormsAuthenticationTicket.
 * remove dependency with struts.
 *
 * 如果是任务触发执行,ThreadLocal是没有值的
 * 这里重写了hashcode方法
 */
public class DotnetAuthenticationTicket {
    private final static ThreadLocal<DotnetAuthenticationTicket> holder = new ThreadLocal<DotnetAuthenticationTicket>();

    /**
     * 指定的版本号
     */
    private int _version = 0;
    /**
     * 登录用户名
     */
    private String _userName;
    /**
     * 用户data
     */
    private String _userData;
    /**
     * 登录写入的路径
     */
    private String _appPath;
    /**
     * 过期日期
     */
    private Date _expires;
    /**
     * 发布日期
     */
    private Date _issueDate;

    private boolean _isPersistent = false;

    public int getVersion() {
        return _version;
    }

    public String getUsername() {
        return _userName;
    }

    public String getUserData() {
        return _userData;
    }

    public String getAppPath() {
        return _appPath;
    }

    public Date getExpires() {
        return _expires;
    }

    public Date getIssueDate() {
        return _issueDate;
    }

    public boolean isPersistent() {
        return _isPersistent;
    }

    /**
     * 判断cookie是不是过期
     * 
     * @return true 过期。false 未过期
     */
    public boolean isExpired() {
        return (new Date()).after(_expires);
    }

    public DotnetAuthenticationTicket(String username, String userdata,
            String appPath,
                                     Date issued, Date expires, int version,
            boolean isPersistent) throws Exception {
        if (username == null || username == null)
            throw new Exception("username");
        else
            _userName = username;
        if (userdata == null)
            _userData = "";
        else
            _userData = userdata;
        if (appPath == null)
            _appPath = "/";
        else if (!appPath.startsWith("/"))
            _appPath = "/" + appPath;
        else
            _appPath = appPath;
        if (issued == null)
            _issueDate = new Date();
        else
            _issueDate = issued;
        if (expires == null)
            _expires = new Date(System.currentTimeMillis() + 30 * 1000 * 60); // 30
                                                                              // mins
        else
            _expires = expires;
        if (version > 0)
            _version = version;
        else
            _version = 1;

    }

    public String toString() {
        return "version=" + _version + "," +
                "userName=" + _userName + "," +
                "userData=" + _userData + "," +
                "appPath=" + _appPath + "," +
                "isPersistent=" + _isPersistent + "," +
                "issueDate=" + _issueDate + "," +
                "expires=" + _expires;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        DotnetAuthenticationTicket ticket = (DotnetAuthenticationTicket) o;

        if (_isPersistent != ticket._isPersistent)
            return false;
        if (_version != ticket._version)
            return false;
        if (_appPath != null ? !_appPath.equals(ticket._appPath)
                : ticket._appPath != null)
            return false;
        if (_expires != null ? !_expires.equals(ticket._expires)
                : ticket._expires != null)
            return false;
        if (_issueDate != null ? !_issueDate.equals(ticket._issueDate)
                : ticket._issueDate != null)
            return false;
        if (_userData != null ? !_userData.equals(ticket._userData)
                : ticket._userData != null)
            return false;
        if (_userName != null ? !_userName.equals(ticket._userName)
                : ticket._userName != null)
            return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = _version;
        result = 31 * result + (_userName != null ? _userName.hashCode() : 0);
        result = 31 * result + (_userData != null ? _userData.hashCode() : 0);
        result = 31 * result + (_appPath != null ? _appPath.hashCode() : 0);
        result = 31 * result + (_expires != null ? _expires.hashCode() : 0);
        result = 31 * result + (_issueDate != null ? _issueDate.hashCode() : 0);
        result = 31 * result + (_isPersistent ? 1 : 0);
        return result;
    }

    /**
     * 实际上是将FormsAuthenticationTicket放到了actionContext中
     * 
     * @param ticket
     *            对象
     */
    public static void setTicket(DotnetAuthenticationTicket ticket) {
        holder.set(ticket);
    }

    /**
     * 取出ticket的上下文
     * 
     * @return null 如果没有的话
     */
    public static DotnetAuthenticationTicket getTicket() {
        return holder.get();
    }

    /**
     * 删除上下文、其实一般不用删除
     */
    public static void remove() {
        holder.remove();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值