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