abstractwebapplicationservice.java

来自「CAS在Tomcat中实现单点登录项目,单点登录(Single Sign On 」· Java 代码 · 共 174 行

JAVA
174
字号
/* * Copyright 2007 The JA-SIG Collaborative. All rights reserved. See license * distributed with this file and available online at * http://www.uportal.org/license.html */package org.jasig.cas.authentication.principal;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.Collections;import java.util.HashMap;import java.util.Map;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.jasig.cas.util.DefaultUniqueTicketIdGenerator;import org.jasig.cas.util.SamlUtils;import org.jasig.cas.util.UniqueTicketIdGenerator;/** * Abstract implementation of a WebApplicationService. *  * @author Scott Battaglia * @version $Revision: 1.3 $ $Date: 2007/04/19 20:13:01 $ * @since 3.1 * */public abstract class AbstractWebApplicationService implements WebApplicationService {    protected static final Log LOG = LogFactory.getLog(SamlService.class);        private static final Map<String, Object> EMPTY_MAP = Collections.unmodifiableMap(new HashMap<String, Object>());        private static final UniqueTicketIdGenerator GENERATOR = new DefaultUniqueTicketIdGenerator();        /** The id of the service. */    private final String id;        /** The original url provided, used to reconstruct the redirect url. */    private final String originalUrl;    private final String artifactId;        private Principal principal;        private boolean loggedOutAlready = false;        protected AbstractWebApplicationService(final String id, final String originalUrl, final String artifactId) {        this.id = id;        this.originalUrl = originalUrl;        this.artifactId = artifactId;    }        public final String toString() {        return this.id;    }        public final String getId() {        return this.id;    }        public final String getArtifactId() {        return this.artifactId;    }    public final Map<String, Object> getAttributes() {        return EMPTY_MAP;    }    protected static final String cleanupUrl(final String url) {        if (url == null) {            return null;        }        final int jsessionPosition = url.indexOf(";jsession");        if (jsessionPosition == -1) {            return url;        }        final int questionMarkPosition = url.indexOf("?");        if (questionMarkPosition < jsessionPosition) {            return url.substring(0, url.indexOf(";jsession"));        }        return url.substring(0, jsessionPosition)            + url.substring(questionMarkPosition);    }        protected final String getOriginalUrl() {        return this.originalUrl;    }    public boolean equals(final Object object) {        if (object == null) {            return false;        }        if (object instanceof Service) {            final Service service = (Service) object;            return getId().equals(service.getId());        }        return false;    }        protected Principal getPrincipal() {        return this.principal;    }    public void setPrincipal(final Principal principal) {        this.principal = principal;    }        public boolean matches(final Service service) {        return this.id.equals(service.getId());    }        public synchronized boolean logOutOfService(final String sessionIdentifier) {        if (this.loggedOutAlready) {            return true;        }        LOG.debug("Sending logout request for: " + getId());        final String logoutRequest = "<samlp:LogoutRequest xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" ID=\""            + GENERATOR.getNewTicketId("LR")            + "\" Version=\"2.0\" IssueInstant=\"" + SamlUtils.getCurrentDateAndTime()            + "\"><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">@NOT_USED@</saml:NameID><samlp:SessionIndex>"            + sessionIdentifier + "</samlp:SessionIndex></samlp:LogoutRequest>";        HttpURLConnection connection = null;        try {            final URL logoutUrl = new URL(getOriginalUrl());            final String output = "logoutRequest=" + URLEncoder.encode(logoutRequest, "UTF-8");            connection = (HttpURLConnection) logoutUrl.openConnection();            connection.setDoInput(true);            connection.setDoOutput(true);            connection.setRequestProperty("Content-Length", ""                + Integer.toString(output.getBytes().length));            connection.setRequestProperty("Content-Type",                "application/x-www-form-urlencoded");            final DataOutputStream printout = new DataOutputStream(connection                .getOutputStream());            printout.writeBytes(output);            printout.flush();            printout.close();            final BufferedReader in = new BufferedReader(new InputStreamReader(connection                .getInputStream()));            while (in.readLine() != null) {                // nothing to do            }                        return true;        } catch (final Exception e) {            return false;        } finally {            if (connection != null) {                connection.disconnect();            }            this.loggedOutAlready = true;        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?