同一网站的多个域名之间访问共享信息

1. ContextSingleListener

 

package test;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.apache.log4j.Logger;

public class ContextSingleListener extends HttpServlet implements ServletContextListener {


  Logger logger = Logger.getLogger(ContextSingleListener.class);


  public void contextInitialized(ServletContextEvent sce) {


    ServletContext context=sce.getServletContext();

    //初始化时往context里放东西
    context.setAttribute("idlist",new Hashtable());
    context.setAttribute("sessionid",new HashMap());


    logger.info("初始化了Context,添加了idlist sessionid ");


  }

  

  public void contextDestroyed(ServletContextEvent sce) {

    //销毁时从context里移除东西
    ServletContext context=sce.getServletContext();
    context.removeAttribute("idlist");


  }
}

 

2.SessionSingleBean

 

package test;

import java.util.HashMap;
import java.util.Hashtable;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;


public class SessionSingleBean {


   Logger logger = Logger.getLogger(SessionSingleBean.class);


   public SessionSingleBean() {
   }


   public HttpSession checkSession(HttpServletRequest request,String sid,HttpSession user)
   {
     boolean issession=true;
     HttpSession session = null;


     Hashtable hashtable=(Hashtable)request.getSession().getServletContext().getAttribute("idlist");
     HashMap hashMap=(HashMap)request.getSession().getServletContext().getAttribute("sessionid");
     synchronized(this)
     {
      Object obj = null;
       try{
//      根据sessionId获取session
        if(user==null){
         obj=hashtable.get(sid);
        }else{
         obj=hashtable.get(user.getId());
        } 
       
        if(obj!=null)
        {
          //这里使用Hashtable因为 Hashtable本身是synchronized 所以为了方便就使用Hashtable
          
         session = (HttpSession)hashtable.get(user.getId());
        }else
        {
            if(user!=null){
             hashtable.put(user.getId(),user);
           hashMap.put(request.getSession().getId(),user.getId());
           logger.info(user.getId()+"  已经填入上下文");
           logger.info(">>>>>>>>>>>>>>>>>>>>>>>>");
           session = (HttpSession)hashtable.get(user.getId()); 
            }else{
            
           logger.info("根据所给的sessionid没有获取到session,且传入的user为空");
           logger.info(">>>>>>>>>>>>>>>>>>>>>>>>");

            }
         

        }
       }catch(Exception e){
        e.printStackTrace();
       }
     }
     return session;
   }
 }

 

3.SessionSingleListener

 

package test;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.apache.log4j.Logger;


public class SessionSingleListener extends HttpServlet implements HttpSessionListener {


   Logger logger = Logger.getLogger(SessionSingleListener.class);

   

   public void sessionCreated(HttpSessionEvent se) {

   }

 

   
   public void sessionDestroyed(HttpSessionEvent se) {

     //要销毁session
     HttpSession session=se.getSession();
     String id=session.getId();


     ServletContext context=se.getSession().getServletContext();

     Hashtable hashtable=(Hashtable)context.getAttribute("idlist");
     HashMap hashMap=(HashMap)context.getAttribute("sessionid");

     //如果没有相关信息

     Object objname=hashMap.get(id);
     if(objname==null) return;

   
     String userid=objname.toString();


     //获取session
     HttpSession userext =(HttpSession)hashtable.remove(userid);
     hashMap.remove(id);


     logger.info("Session 过期 删除Context中的 用户"+userext.getAttribute("mobile_no") +" 项");
    


   }
 }

 

一个网站有A,B两个域名,在A域名时调用SessionSingleBean往context中存入登录信息,跳到B域名时根据sessionid从context中取出相关登录信息。

当然也可以写加密类把相关信息加密,以get方式传送过去,然后解密。

 

4.web.xml

 

  <listener>
       <listener-class>test.ContextSingleListener</listener-class>
  </listener>
  <listener>
       <listener-class>test.SessionSingleListener</listener-class>
  </listener>

 

5.log4j.properties

# An example log4j configuration file that outputs to System.out.  The
# output information consists of relative time, log level, thread
# name, logger name, nested diagnostic context and the message in that
# order.

# For the general syntax of property based configuration files see the
# documenation of org.apache.log4j.PropertyConfigurator.

log4j.rootLogger=ERROR, A1

# A1 is set to be a ConsoleAppender which outputs to System.out.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout

# The conversion pattern uses format specifiers. You might want to
# change the pattern an watch the output format change.
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

# In this example, we are not really interested in INNER loop or SWAP
# messages. See the effects of uncommenting and changing the levels of
# the following loggers.
# log4j.logger.org.apache.log4j.examples.SortAlgo.INNER=WARN
# log4j.logger.org.apache.log4j.examples.SortAlgo.SWAP=WARN

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值