/* ==================================================================
* 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);
}
}
}