最近接手了一些使用CAS,单点登陆的几个项目,项目进行挺顺利,没想到在最后创建这几个项目的索引页(索引项目)并抓取各子项目的信息内容的时候,需要穿过cas的filter和子项目的filter,现将思路整理一下。
1.穿过cas,修改casclient的源代码,重新打jar包发布到子应用下,意在调用该项目的接口的时候,不被CAS客户端拦截
casPassUrl = config.getInitParameter( "edu.yale.its.tp.cas.client.filter.passUrl"); /** 在init方法中增加,获取一串允许通过的url路径,用逗号分隔*/ /**在dofilter中增加一下代码*/ String[] strs = casPassUrl.split(","); for(int i=0;i<strs.length;i++){ if(temp.startsWith(strs[i])){ fc.doFilter(request, response); return ; } }
这样可以使不希望被拦截的请求,顺利通过cas
2.穿过子项目的loginFilter,跟上面的类似,也是得增加一个穿过的url路径,在filter加判断
if(request.getRequestURI().startsWith(passUrl)){ bool = true; } if(!bool){ String script = "<script>window.location=\""+contextPath+"/\"</script>"; response.getWriter().print(script); }else{ chain.doFilter(req, res); }
这样两步走就可以实现希望一个请求在不需要登陆的情况下就可以直接穿过cas和子项目的filter
后来又扩展了想了想,如果请求的路径比较多,每一个路径都需要配置2份那岂不是很麻烦,或者你请求的处理类需要登陆的信息怎么办
个人感觉还是在子项目的过滤器中增加一个登陆步骤,当然是必须已经通过了cas的用户验证了
public void setSessionUser(HttpSession session,String casUserName){ ServletContext servletContext = session.getServletContext(); WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext); UserService userService = (UserService)wac.getBean("userService"); UserVo user = userService.getUserbyName(casUserName); UserVo mUser = userService.getMUserByDepId(user.getDep().getId()+""); SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); Date now = new Date(); session.setAttribute("user", user); session.setAttribute("mUser", mUser); session.setAttribute("year", sdf.format(now)); }
由于项目是使用spring,在filter中获取service类实例对象也只好这样将就将就了
总结完毕,欢迎大家拍砖