/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.seasar.extension.httpsession; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.seasar.framework.util.StringUtil; /** * セッション識別子に関するユーティリティクラスです。 * * @author higa * */ public class SessionIdUtil { /** * セッション識別子のキーをあらわします。 */ public static final String SESSION_ID_KEY = "S2SESSIONID"; static String cookieName = SESSION_ID_KEY; static int cookieMaxAge = -1; static String cookiePath = null; static Boolean cookieSecure = null; /** * Cookieからセッション識別子を取り出します。 * * @param request * リクエスト * @return セッション識別子 */ public static String getSessionIdFromCookie(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies == null) { return null; } for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals(cookieName)) { return cookie.getValue(); } } return null; } /** * URIからセッション識別子を取り出します。 * * @param request * リクエスト * @return セッション識別子 */ public static String getSessionIdFromURL(HttpServletRequest request) { String partOfUri = ";" + cookieName + "="; String uri = request.getRequestURI(); int index = uri.lastIndexOf(partOfUri); if (index < 0) { return null; } uri = uri.substring(index + partOfUri.length()); int index2 = uri.indexOf('?'); if (index2 < 0) { return uri; } return uri.substring(0, index2); } /** * URLを書き換えて必要ならセッション識別子を組み込みます。 * * @param url * URL * @param request * リクエスト * @return 書き換えたURL */ public static String rewriteURL(String url, HttpServletRequest request) { if (request.isRequestedSessionIdFromCookie()) { return url; } HttpSession session = request.getSession(false); if (session == null) { return url; } String partOfUri = ";" + cookieName + "="; int index = url.indexOf('?'); if (index < 0) { return url + partOfUri + session.getId(); } else { return url.substring(0, index) + partOfUri + session.getId() + url.substring(index); } } /** * セッション識別子用のCookieを書き込みます。 * * @param request * リクエスト * @param response * レスポンス * @param sessionId * セッション識別子 */ public static void writeCookie(HttpServletRequest request, HttpServletResponse response, String sessionId) { if (request.isRequestedSessionIdFromCookie()) { return; } Cookie cookie = new Cookie(cookieName, sessionId); if (StringUtil.isNotEmpty(cookiePath)) { cookie.setPath(cookiePath); } else { String path = request.getContextPath(); cookie.setPath(StringUtil.isEmpty(path) ? "/" : path); } cookie.setMaxAge(cookieMaxAge); if (cookieSecure != null) { cookie.setSecure(cookieSecure.booleanValue()); } response.addCookie(cookie); } }