/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.core.web.filter; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.Set; 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.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import com.jinhe.tss.core.exception.BusinessServletException; import com.jinhe.tss.core.sso.context.Context; import com.jinhe.tss.core.sso.context.RequestContext; /** * <p> * ContextFilter.java * </p> * * <pre> * 上下文对象相关过滤器:初始化及销毁上下文对象(UserContext、RequestContext等)。 <br/> * 过滤器顺序:本filter应该配置AutoLoginFilter之前,因为后者需要的一些(类似用户名、密码、验证方式、token等)需要从Context中获取。<br/> * * 类似在线用户库远程调用可以跳过本过滤器,以防PMS/CMS等系统session注销时调用UMS配置的/remote/OnlineUserService,又会在UMS产生一个新的session。 * </pre> */ public class ContextFilter implements Filter { private static Logger log = Logger.getLogger(ContextFilter.class); private Set<String> ignoreServletPaths = new HashSet<String>(); public void init(FilterConfig filterConfig) throws ServletException { String paths = filterConfig.getInitParameter("ignoreServletPaths"); if (paths != null) { ignoreServletPaths.addAll(Arrays.asList(paths.split(","))); } log.info("上下文环境初始化完成!appCode=" + Context.getApplicationContext().getCurrentAppCode()); } public void destroy() { ignoreServletPaths = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String servletPath = RequestContext.getServletPath((HttpServletRequest)request); log.debug("当前请求ServletPath: " + servletPath); if (ignoreServletPaths.contains(servletPath)) { chain.doFilter(request, response); return; } try { //初始化上下文对象(RequestContext等) Context.initRequestContext((HttpServletRequest) request); Context.setResponse((HttpServletResponse) response); chain.doFilter(request, Context.getResponse()); //使用转换后的response Context.destroy(); //请求结束后销毁Context } catch (Exception e) { throw new BusinessServletException(e); } } }