设为首页 收藏本站
查看: 1185|回复: 0

[经验分享] Apache.Tomcat整合,用cookie取代Tomcat之间Session的复制

[复制链接]
发表于 2017-1-14 10:32:58 | 显示全部楼层 |阅读模式
  公司网站用Apache+Tomcat集群后,经过观察发现Tomcat之间的Session复制非常的消耗资源。一个Tomcat挂掉后,另外一个要复制很久才能复制完成。导致如果session很多,一个Tomcat挂掉,网站访问变得很慢.
  现在改成Cookie来取替Tomcat之间的复制,具体实现方式如下:
  登录时将用户信息存入一份在Session中,然后向用户的本机中插入一条cookie信息。由于去掉了Tomcat之间Session的复制所以需要用到Session业务的时候,在一个Tomcat中有session信息,如果在这个过程中被分配到另外一个Tomcat运行后就会出现找不到Session信息的错误。考虑到这一条我写了一个过滤器来对网站的请求进行过滤,先判断session中有没有值。如果有就过,如果没有就到本地来取一次cookie,如果存在即在当前Tomcat上恢复Session.代码如下
  Cookie工具类

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Cookie 工具类增,删,查
*
* @author ws715
*
*/
public class CookieUtil {
/**
* 按名字得到Cookie
*
* @param request
* @param name
* @return
*/
private CookieUtil() {
}
public static Cookie getCookie(HttpServletRequest request, String name) {
Cookie cookies[] = request.getCookies();
if (cookies == null || name == null || name.length() == 0) {
return null;
}
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (name.equals(cookies.getName())) {
return cookies;
}
}
}
return null;
}
/**
* 将cookie中的数据保存到session中
*
* @param request
* @param name
* @return
*/
public static boolean setSessionFormCookie(HttpServletRequest request,
String name) {
String target = null;
Cookie cookies[] = request.getCookies();
boolean bool = false;
if (cookies == null || name == null || name.length() == 0) {
bool = false;
}
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (name.equals(cookies.getName())) {
target = cookies.getValue();
break;
}
}
}
if (target != null && !target.equals("")) {
HttpSession session = request.getSession();
session.setAttribute("UserName", target.toString());
bool = true;
}
return bool;
}
/**
* 删除Cookie
*
* @param request
* @param response
* @param cookie
*/
public static void deleteCookie(HttpServletRequest request,
HttpServletResponse response, Cookie cookie) {
if (cookie != null) {
cookie.setPath(getPath(request));
cookie.setValue("");
// cookie.setDomain("");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
/**
* 按名字删除
*
* @param request
* @param response
* @param name
*/
public static void deleteCookie(HttpServletRequest request,
HttpServletResponse response, String name) {
Cookie cookies[] = request.getCookies();
Cookie myCookie = null;
boolean bool = false;
if (cookies == null || name == null || name.length() == 0) {
throw new NullPointerException(
"getCookie deleteCookie method name is not null");
}
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (name.equals(cookies.getName())) {
myCookie = cookies;
break;
}
}
if (myCookie != null) {
deleteCookie(request, response, myCookie);
}
}
}
/**
* 保存到Cookie中
*
* @param request
* @param response
* @param name
* @param value
*/
public static void setCookie(HttpServletRequest request,
HttpServletResponse response, String name, String value) {
setCookie(request, response, name, value, 0x278d00);
}
/**
* 可以设置时间
*
* @param request
* @param response
* @param name
* @param value
* @param maxAge
*/
public static void setCookie(HttpServletRequest request,
HttpServletResponse response, String name, String value, int maxAge) {
Cookie cookie = new Cookie(name, value == null ? "" : value);
cookie.setMaxAge(maxAge);
// cookie.setDomain(request.getServerName());
cookie.setPath(getPath(request));
response.addCookie(cookie);
}
private static String getPath(HttpServletRequest request) {
String path = request.getContextPath();
return (path == null || path.length() == 0) ? "/" : path;
}
/**
* 从cookie中获得username
*
* @param request
* @param name
* @return
*/
public static String getUserNameForCookie(HttpServletRequest request,
String name) {
String username = "";
Cookie cookies[] = request.getCookies();
if (cookies == null || name == null || name.length() == 0) {
return null;
}
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (name.equals(cookies.getName())) {
try {
username = (cookies.getValue().split("#"))[0];
} catch (Exception e) {
username = null;
}
}
}
}
return username;
}
}

  过滤器

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionCookieFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// 通过检查session中的变量,过虑请求
HttpSession session = httpServletRequest.getSession();
String   UserName="guest" ;
if(session.getAttribute("UserName")==null ||
session.getAttribute("UserName").equals("guest")){
if(!com.pixel.util.CookieUtil.setSessionFormCookie(httpServletRequest,"cookiename")){  
session.setAttribute("UserName",UserName);
}
}
chain.doFilter(request, response);  
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}

  登录时加入cookie中

CookieUtil.setCookie(request,response,"cookiename",cookieValue.toString(),60*120);     
   不知道还有没有更好的办法和改进的余地

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-328252-1-1.html 上篇帖子: Apache 2.2 + Tomcat 使用UrlRewrite实现泛域名解析的尝试 下篇帖子: 靓号正则表达式(前后向查找等) 和 apache正则包使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表