JAVA远程session访问,访问独立SESSION服务器

本文介绍了一种使用Tomcat和Redis实现的会话管理方案,通过远程登录及sessionID获取服务端session的方式,实现了业务侧不保存任何session信息的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前项目有需求做了一个tomcat+redis的PAcount服务器,存储整个平台的session数据,整个业务侧不存储任何session信息,下面逻辑就是如何远程登陆并根据sessionID获取服务端session的逻辑
public class CookieSotreUtils {
    public static final String method = "POST";
    public static final String charset = "UTF-8";
    public static final String client_serviceUrl = "clientLogin";
    public static final String mgr_serviceUrl = "mgrLogin";
    public static final String MGR_COOKIE_KEY = "MGR_SESSION_ID";
    public static final String CLIENT_COOKIE_KEY = "CLIENT_SESSION_ID";


    public static String postParameters(String urlString, String param, HttpServletResponse response, HttpServletRequest request) throws IOException {
        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod(method);
        connection.setUseCaches(false);
        connection.setInstanceFollowRedirects(false);
        connection.setRequestProperty("Connection", "keep-alive");
        connection.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.8");
        connection.setRequestProperty("Accept-Encoding", "gzip, deflate");
        connection.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01");
        connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        connection.setRequestProperty("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36");
        connection.setRequestProperty("X-Requested-With", "XMLHttpRequest");
        String path = url.getPath();
        if (path.contains("client") || path.contains("Cutomer")) {
            Cookie cookie = getCookieByName(request, CLIENT_COOKIE_KEY);
            if (cookie != null) {
                connection.setRequestProperty("Cookie", "JSESSIONID=" + cookie.getValue());
            }
        } else {
            Cookie cookie = getCookieByName(request, MGR_COOKIE_KEY);
            if (cookie != null) {
                connection.setRequestProperty("Cookie", "JSESSIONID=" + cookie.getValue());
            }
        }
        connection.connect();
        DataOutputStream dataOut = new DataOutputStream(connection.getOutputStream());
        dataOut.writeBytes(param);
        dataOut.flush();
        dataOut.close();
        String cookieValue = connection.getHeaderField("Set-Cookie");
        if (StringUtils.isNotEmpty(cookieValue)) {
            String JSESSIONID = cookieValue.substring("JSESSIONID=".length(), cookieValue.indexOf(";"));
            if (urlString.contains(client_serviceUrl)) {
                setCookie(CLIENT_COOKIE_KEY, JSESSIONID, response);
            } else if (urlString.contains(mgr_serviceUrl)) {
                setCookie(MGR_COOKIE_KEY, JSESSIONID, response);
            }
        }
        String result = IOUtils.toString(connection.getInputStream(), charset);
        connection.disconnect();
        return result;
    }

    /**
     * 获取所有的cookie信息转为map集合
     */
    public static Map<String, Cookie> ReadCookieMap(HttpServletRequest request) {
        Map<String, Cookie> cookieMap = new HashMap<>();
        Cookie[] cookies = request.getCookies();
        if (null != cookies) {
            for (Cookie cookie : cookies) {
                cookieMap.put(cookie.getName(), cookie);
            }
        }
        return cookieMap;
    }

    /**
     * 根据名字获取cookie
     */
    public static Cookie getCookieByName(HttpServletRequest request, String name) {
        Map<String, Cookie> cookieMap = ReadCookieMap(request);
        if (cookieMap.containsKey(name)) {
            return cookieMap.get(name);
        } else {
            return null;
        }
    }

    /**
     * 设置cookie信息(sessionId)
     *
     * @param key cookie key
     * @param val cookie value
     */
    public static void setCookie(String key, String val, HttpServletResponse response) {
        Cookie cookie = new Cookie(key, val);
        if (key.equals(MGR_COOKIE_KEY)) {
            cookie.setDomain(".qiku.com");
        } else {
            cookie.setDomain(".360os.com");
        }
        //24小时过期
        cookie.setMaxAge(60 * 60 * 24);
        cookie.setPath("/");
        response.addCookie(cookie);
    }

    /**
     * 删除cookie信息(sessionId)
     *
     * @param cookie 要删除的cookie
     */
    public static void removeCookie(Cookie cookie) {
        cookie.setValue(null);
        String key = cookie.getName();
        if (key.equals(MGR_COOKIE_KEY)) {
            cookie.setDomain(".qiku.com");
        } else {
            cookie.setDomain(".360os.com");
        }
        cookie.setMaxAge(0);
        cookie.setPath("/");
    }

    /**
     * 删除服务端cookie信息(sessionId)
     */
    public static void removeMgrCookie(HttpServletRequest request, HttpServletResponse response) {
        Cookie cookie = getCookieByName(request, MGR_COOKIE_KEY);
        if (cookie != null) {
            removeCookie(cookie);
            response.addCookie(cookie);
        }
    }

    /**
     * 删除客户端cookie信息(sessionId)
     */
    public static void removeClientCookie(HttpServletRequest request, HttpServletResponse response) {
        Cookie cookie = getCookieByName(request, CLIENT_COOKIE_KEY);
        if (cookie != null) {
            removeCookie(cookie);
            response.addCookie(cookie);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值