论坛首页 Java企业应用论坛

JSF+hibernate的系统中,Filter的问题,给点建议吧!

浏览 1740 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2008-04-09  
public class AuthenticateFilter implements Filter {
private static Logger logger = Logger.getLogger(AuthenticateFilter.class);

    private ServletContext context = null;

    public AuthenticateFilter() {
        super();
    }

    public void init(FilterConfig arg0) throws ServletException {
        context = arg0.getServletContext();

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException {

        if (request instanceof HttpServletRequest) {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpSession session = req.getSession(true);
           
//            logger.debug("Request Path Info:" + req.getPathInfo());
//            logger.debug("Request URI:" + req.getRequestURI());
//            logger.debug("Request URL:" + req.getRequestURL());
//            logger.debug("Session ID : " + session.getId());
           
            User user = (User) session.getAttribute("user");

            logger.debug("doFilter QS : " + req.getQueryString());
            //logger.debug("user is null:" + user);
            if (user != null) {
            boolean canAccess = false;
        try {
        Map parameters = new HashMap();
       
        Enumeration names = request.getParameterNames();
        String name = null;
        String value = null;
                while (names.hasMoreElements()) {
                name = (String) names.nextElement();
                value = request.getParameter(name);
                   
                parameters.put(name, value);
                }

//                logger.debug("OP: " + parameters.get("op"));
        canAccess = AccessControlService.getInstance().canAccess(user, parameters);
        } catch (ServiceException sx) {
        logger.error(sx.getMessage(), sx);
        }
       
        if(canAccess) { // can access
        filterChain.doFilter(request, response);       
        } else { // can't access
        clearSession(req);
        logger.debug("doFilter user is null forward(accessDenied.html):" + user);
                    request.getRequestDispatcher("/accessDenied.html").forward(request, response);                     
        }
        logger.debug("user:"+ user.getName());
            } else {
            String operation = req.getParameter("op");
            //logger.debug("user:"+ user.getName());
            logger.debug("doFilter OP : " + operation);
            logger.debug("URI: " + req.getRequestURI());
            logger.debug("URL: " + req.getRequestURL());
//            logger.debug("QS : " + req.getQueryString());
if (operation != null && operation.equals("approval")) {
String templateId = req.getParameter("templateId");
String applicationId = req.getParameter("applicationId");
logger.debug("Template ID   : " + templateId);
logger.debug("Application ID: " + applicationId);
session.setAttribute("approval", req.getRequestURL().toString() + "?op=approval");
session.setAttribute("templateId", templateId);
session.setAttribute("applicationId", applicationId);
logger.debug("doFilter user is null operation is not null::" + user);
request.getRequestDispatcher("/filterError.html").forward(request, response);
}else {
logger.debug("doFilter user is null operation is  null ::" + user);
clearSession(req);
request.getRequestDispatcher("/filterError.html").forward(request, response);
}
            }           
           
        }

    }

    public void destroy() {
    }
   
    private void clearSession(HttpServletRequest request) {
        Enumeration names = request.getSession().getAttributeNames();
        while (names.hasMoreElements()) {
            request.getSession().removeAttribute((String) names.nextElement());           
        }
        request.getSession().invalidate();
    }
}

经过第一次过滤的时候,session里存储的值,都能正常读出,但是在第二次过滤时,就会将session中的存储的登陆用户信息清空,第一次过滤是main.jsp加载的时候,第二次是当点击main.jsp页面上一个按钮时,弹出新窗口后就清空掉session里的用户信息值,导致后面的页面从session中读值全是空的,直接跳转回登陆页面。
问题就在为什么二次过滤时,会把session中存储的用户信息过滤掉,我将过滤器的配置文件更改后,不过滤点击按钮弹出的页面,程序就正常了。但是该系统是用到两个不同的登陆名进去,1进入后有四个权限角色,2进入后只有两个权限角色,1进入系统后,过滤器即使是二次过滤也不会把session里存储的用户信息清空,但是2进入后,二次过滤就把session里存储的用户信息清空掉了。
PS:过滤器过滤时,弹出一个新窗口,是否会因为过滤器把请求连接的URL地址清空?
   发表时间:2008-04-09  
弹出新窗口确实有可能引起session数据的丢失,请楼主搜索 "新窗口 session",会找到线索
0 请登录后投票
   发表时间:2008-04-09  
如果不加过滤器,我的session里的值在新窗口可以获取到,但是加上过滤器后,第一次加载新窗口可以正确输出,但点击新窗口里的提交按纽后,先经过过滤器,就在这时,过滤器把session里的用户信息清空了。恼火就在这里,网上大部分的过滤器例子都是针对转码问题。但是我们是外资公司,所有的东西都是全英文环境,不涉及到转码,系统中的过滤器也只是起到一个登陆用户信息是否为空的判断,然后就转给servlet处理了。怪就怪在第一次判断session中的用户信息,全有值,但是第二次过滤时,就变的没有值了,就执行else里的语句去了,但是在配置文件中将这个过滤器的指定过滤页面删除掉,就不报错了!
0 请登录后投票
   发表时间:2008-04-11  
哎!没办法了,没人给点实际点的意见,我把filter配置文件过滤的部分页面删除掉了。不执行过滤功能,然后程序跑起来没问题。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics