解决方案 »

  1.   

    Struts2拦截session用Filter
    例:package com.utils;import java.io.IOException;
    import java.util.Map;import javax.annotation.Resource;
    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.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;import org.apache.log4j.Logger;
    import org.apache.struts2.ServletActionContext;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;import com.cheater.init.service.InitService;
    import com.cheater.init.service.InitServiceImpl;
    import com.cheater.model.User;/**
     * 
     * @Date: 2013-12-13 下午4:59:27
     * @Author: Gyh
     * @TODO: 系统权限过滤器(未登录用户不允许访问某些功能)
     */
    public class PrivilegeFilter implements Filter {
    WebApplicationContext context;
    private static Logger logger = Logger.getLogger(LogAspect.class);
    @Override
    public void destroy() {
    } @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {
    doBeforeFilter(arg0);//判断是否保存有登录信息
    try {
    HttpServletRequest request = (HttpServletRequest) arg0;
    HttpServletResponse response = (HttpServletResponse) arg1;
    User user = (User) request.getSession().getAttribute(Constants.USER);

    String action = request.getServletPath();//action名
    System.out.println("调用的action:"+action);
    if(null!=request.getQueryString())
    System.out.println("传递的参数:"+request.getQueryString());
    //String params=request.getQueryString();//后面的参数
    Map<String,String>acceptedAction=Constants.ACCEPTED_ACTION;
    if (null==user&&acceptedAction.containsKey(action)){
    response.sendRedirect(request.getContextPath()
    + "/init_login.action");
    }
    else{
    arg2.doFilter(request, response);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    } private void doBeforeFilter(ServletRequest request) {
    HttpSession session = ((HttpServletRequest) request).getSession(true);    
            //首先检查session,若已经登陆则直接忽略以下代码    
            if (session.getAttribute(Constants.USER) != null) {  
                return;    
             }             Cookie[] cookies = ((HttpServletRequest) request).getCookies();    
             String email = null;    
             String password = null;   
            if (cookies != null) {    
                for (Cookie c : cookies) {    
                    if (c.getName().equals("email")) {    
                     email = c.getValue();    
                     }    
                    if (c.getName().equals("pass")) {    
                         password = c.getValue();    
                     }    
                 }
                context=WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());
              //获取spring bean
                InitService initService = (InitService) context.getBean("initService");
                User user=initService.getUser(email, password);
                if (user!=null) {    
              logger.info(user.getEmail()+" 通过COOKIE登录..");
                     session = ((HttpServletRequest) request).getSession(true);    
                     session.setAttribute(Constants.USER,user);    
                 }   
             }    
    } @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
    }
      

  2.   

    我用Filter写了一个登录过滤器,session还是获取不了。然后我又检查了其他的session使用,都可以,唯独在ACTION里面的session设置后,在其他任何地方都无法获取session。
      

  3.   

    一个过滤写这么麻烦 直接用javax.servlet.Filter;这个接口