CAS-Client客戶端研究--AssertionThreadLocalFilter
阿新 • • 發佈:2019-02-08
配置在客戶端web.xml中:
<!-- 該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取使用者的登入名。 比如AssertionHolder.getAssertion().getPrincipal().getName() --> <filter> <filter-name>CAS Assertion Thread Local Filter</filter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Assertion Thread Local Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { //轉換引數 final HttpServletRequest request = (HttpServletRequest) servletRequest; final HttpSession session = request.getSession(false); //取得Assertion物件,如果session為null則從request中取得,否則從session中取得。 final Assertion assertion = (Assertion) (session == null ? request.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION) : session.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION)); try { //繫結到ThreadLocal AssertionHolder.setAssertion(assertion); // 處理後面的過濾器,這樣後面的Fileter和Servlet可以線上程中取得Assertion物件。 filterChain.doFilter(servletRequest, servletResponse); } finally { //處理完畢後清理執行緒 AssertionHolder.clear(); } }
public class AssertionHolder { /** * ThreadLocal to hold the Assertion for Threads to access. */ private static final ThreadLocal<Assertion> threadLocal = new ThreadLocal<Assertion>(); /** * Retrieve the assertion from the ThreadLocal. * * @return the Asssertion associated with this thread. */ public static Assertion getAssertion() { return threadLocal.get(); } /** * Add the Assertion to the ThreadLocal. * * @param assertion the assertion to add. */ public static void setAssertion(final Assertion assertion) { threadLocal.set(assertion); } /** * Clear the ThreadLocal. */ public static void clear() { threadLocal.set(null); } }