session到时间后自动失效。可以在过滤器中写,也可以写一个包含文件,在这个包含文件中判断session的某个属性是否为空,为空则调至登录页面。这个比较简单。 
下面是一个过滤器。import javax.servlet.*; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
import java.util.List; 
import java.util.ArrayList; 
import java.util.StringTokenizer; 
import java.io.IOException; /** *//** 
* 用于检测用户是否登陆的过滤器,如果未登录,则重定向到指的登录页面 
* 配置参数 
* checkSessionKey 需检查的在 Session 中保存的关键字 * redirectURL 如果用户未登录,则重定向到指定的页面,URL不包括 ContextPath * notCheckURLList 不做检查的URL列表,以分号分开,并且 URL 中不包括 ContextPath */ 
public class CheckLoginFilter 
implements Filter 

protected FilterConfig filterConfig = null; 
private String redirectURL = null; 
private List notCheckURLList = new ArrayList(); 
private String sessionKey = null; public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException 

HttpServletRequest request = (HttpServletRequest) servletRequest; 
HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); 
if(sessionKey == null) 

filterChain.doFilter(request, response); 
return; 

if((!checkRequestURIIntNotFilterList(request)) && session.getAttribute(sessionKey) == null) 

response.sendRedirect(request.getContextPath() + redirectURL); 
return; 

filterChain.doFilter(servletRequest, servletResponse); 
} public void destroy() 

notCheckURLList.clear(); 
} private boolean checkRequestURIIntNotFilterList(HttpServletRequest request) 

String uri = request.getServletPath() + (request.getPathInfo() == null ? "" : request.getPathInfo()); 
return notCheckURLList.contains(uri); 
} public void init(FilterConfig filterConfig) throws ServletException 

this.filterConfig = filterConfig; 
redirectURL = filterConfig.getInitParameter("redirectURL"); 
sessionKey = filterConfig.getInitParameter("checkSessionKey"); String notCheckURLListStr = filterConfig.getInitParameter("notCheckURLList"); if(notCheckURLListStr != null) 

StringTokenizer st = new StringTokenizer(notCheckURLListStr, ";"); 
notCheckURLList.clear(); 
while(st.hasMoreTokens()) 

notCheckURLList.add(st.nextToken()); 



解决方案 »

  1.   

    不好意思,看这个:package test;import javax.servlet.FilterChain;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.ServletException;
    import javax.servlet.FilterConfig;
    import javax.servlet.http.HttpSession;public class SignonFilter implements Filter
    {
    String LOGIN_PAGE="login_signon.jsp";
    protected FilterConfig filterConfig;

    //过滤处理的方法
    public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
    {
     HttpServletRequest hreq = (HttpServletRequest)req;
             HttpServletResponse hres = (HttpServletResponse)res;
             HttpSession session = hreq.getSession();
             String isLogin="";
             try
             {
              isLogin=(String)session.getAttribute("isLogin");        
             
     if(isLogin.equals("true"))
     {
      System.out.println("在SignonFilter中验证通过");
      //验证成功,继续处理
      chain.doFilter(req,res);
     }
     else
     {
      //验证不成功,让用户登录。
      hres.sendRedirect(LOGIN_PAGE);    
      System.out.println("被SignonFilter拦截一个未认证的请求");
     }
     }
             catch(Exception e)
             {         
              e.printStackTrace();
             }
     
    }

    public void setFilterConfig(final FilterConfig filterConfig)
    {
    this.filterConfig=filterConfig;
    }
        
        //销毁过滤器
    public void destroy()
    {
    this.filterConfig=null;
    }
     /**
         *初始化过滤器,和一般的Servlet一样,它也可以获得初始参数。
         */
        public void init(FilterConfig config) throws ServletException {
            this.filterConfig = config;       
        }

    }
     <filter-name>auth</filter-name> 
               <filter-class>test.SignonFilter</filter-class> 
        </filter>
        <filter-mapping> 
           <filter-name>auth</filter-name> 
           <url-pattern>/*</url-pattern>  
       </filter-mapping>
      

  2.   

    继承HttpSessionBindingListener,实现它的两个方法valueBound()和valueUnbound();Session创建的时候Servlet容器将会调用valueBound方法;Session删除的时候则调用valueUnbound方法.
      

  3.   

    个人觉得用sessionListener比较简单而且方便一些
      

  4.   

    的确,使用httpsessionlistener监听httpsessiondestoryed更合理一点