浏览 1739 次
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-09
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地址清空? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-04-09
弹出新窗口确实有可能引起session数据的丢失,请楼主搜索 "新窗口 session",会找到线索
|
|
返回顶楼 | |
发表时间:2008-04-09
如果不加过滤器,我的session里的值在新窗口可以获取到,但是加上过滤器后,第一次加载新窗口可以正确输出,但点击新窗口里的提交按纽后,先经过过滤器,就在这时,过滤器把session里的用户信息清空了。恼火就在这里,网上大部分的过滤器例子都是针对转码问题。但是我们是外资公司,所有的东西都是全英文环境,不涉及到转码,系统中的过滤器也只是起到一个登陆用户信息是否为空的判断,然后就转给servlet处理了。怪就怪在第一次判断session中的用户信息,全有值,但是第二次过滤时,就变的没有值了,就执行else里的语句去了,但是在配置文件中将这个过滤器的指定过滤页面删除掉,就不报错了!
|
|
返回顶楼 | |
发表时间:2008-04-11
哎!没办法了,没人给点实际点的意见,我把filter配置文件过滤的部分页面删除掉了。不执行过滤功能,然后程序跑起来没问题。
|
|
返回顶楼 | |