﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Sealyu-文章分类-web</title><link>http://www.blogjava.net/sealyu/category/30735.html</link><description>--- The devil's in the Details</description><language>zh-cn</language><lastBuildDate>Wed, 04 Nov 2009 12:25:32 GMT</lastBuildDate><pubDate>Wed, 04 Nov 2009 12:25:32 GMT</pubDate><ttl>60</ttl><item><title>User Session Management and Single Sign-On</title><link>http://www.blogjava.net/sealyu/articles/210439.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Wed, 25 Jun 2008 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/articles/210439.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/210439.html</wfw:comment><comments>http://www.blogjava.net/sealyu/articles/210439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/210439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/210439.html</trackback:ping><description><![CDATA[<p>This chapter explains how the Access Manager Session Service
works with other core Access Manager components to process HTTP requests
and to manage user session data. The chapter traces events in a basic
user session, a single sign-on session (SSO), and a cross-domain single
sign-on session (CDSSO) to give you an overview of Access Manager&#8217;s
features and process flows. Topics covered include:</p>
<ul>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbb?l=zh&amp;a=view">User Sessions and the Session Service</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbc?l=zh&amp;a=view">Sessions, Session Tokens, and Cookies</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbf?l=zh&amp;a=view">Policy Agents</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbg?l=zh&amp;a=view">Basic User Session</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbm?l=zh&amp;a=view">Single Sign-On Session</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbn?l=zh&amp;a=view">Cross-Domain Single Sign-On Session</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbo?l=zh&amp;a=view">Session Termination</a>
    </p>
    </li>
</ul>
<h1>User Sessions and the Session Service</h1>
<p>The Session Service in Sun Java System Access Manager tracks
a user&#8217;s interaction with web applications. For example, the
Session Service maintains information about how long a user has been
logged in to Access Manager, and enforces time-out limits when necessary.
Additionally, the Session Service performs the following actions:</p>
<ul>
    <li>
    <p>Generates session identifiers.</p>
    </li>
    <li>
    <p>Maintains a master copy of session state information.</p>
    </li>
    <li>
    <p>Implements time-dependent behavior of sessions.</p>
    </li>
    <li>
    <p>Implements session life cycle events such as logout
    and session destruction.   </p>
    </li>
    <li>
    <p>Generates session life cycle event notifications.</p>
    </li>
    <li>
    <p>Generates session property change notifications.</p>
    </li>
    <li>
    <p>Implements session quota constraints.</p>
    </li>
    <li>
    <p>Implements session failover.</p>
    </li>
    <li>
    <p>Enables single sign-on (SSO) and cross-domain single
    sign-on (CDSSO) among applications external to Access Manager.</p>
    </li>
</ul>
<p>
A <strong>user session</strong> is the interval between
the moment a user logs in to Access Manager, and the moment the user
logs out of Access Manager. In a typical user session, an employee
attempts to access the corporate benefits administration application.
The application is protected by Access Manager, and Access Manager
prompts the user for a username and password. First, Access Manager <strong>authenticates</strong>, or verifies that the user is who he says
he is. Following user authentication, Access Manager allows the user
access to the application (providing the user has the appropriate
permissions). For a more detailed explanation, see <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbg?l=zh&amp;a=view">Basic User Session</a>.</p>
<p>Oftentimes, in the same user session (without logging out of
the corporate benefits application), the same employee attempts to
access the corporate expense reporting application. Because the expense
reporting application is also protected by Access Manager, the Session
Service provides continued proof of the user&#8217;s authentication,
and the employee is automatically allowed to access the expense reporting
application. The employee has accessed more than one application in
a single user session without having to re-authenticate. This functionality
is called <strong>Single Sign-On</strong> (SSO). When SSO occurs
among applications in more than one DNS domain, the functionality
is called <strong>Cross-Domain Single Sign-On</strong> (CDSSO).
For more detailed explanations, see <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbm?l=zh&amp;a=view">Single Sign-On Session</a> and <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbn?l=zh&amp;a=view">Cross-Domain Single Sign-On Session</a>, respectively.</p>
<h1>Sessions, Session Tokens, and Cookies</h1>
<p>The Access Manager Session Service creates a session data structure
to store information about a user session and uses cookies to store
a token that identifies the session data structure. When a user logs
in and is successfully authenticated, the user is assigned a <strong>session</strong>, a session data structure that, minimally, stores the
following information about a user session:</p>
<dl><dt>Maximum Idle Time</dt><dd>
<p>Maximum number of minutes without activity before
the session will expire and the user must reauthenticate.</p>
</dd><dt>Maximum Session Time</dt><dd>
<p>Maximum number of minutes (activity or no activity)
before the session expires and the user must reauthenticate.</p>
</dd><dt>Maximum Caching Time</dt><dd>
<p>Maximum number of minutes before the client contacts
Access Manager to refresh cached session information.</p>
</dd></dl>
<p>Internally, these session attributes are used to enforce Access
Manager timeout limits. But a session can also contain additional
attributes and properties which can be used by other applications.
For example, a session data structure can store information about
a user&#8217;s identity, or about a user&#8217;s browser preferences.
You can configure Access Manager to include the following types of
information in a session:</p>
<ul>
    <li>
    <p>Fixed session attributes</p>
    </li>
    <li>
    <p>Protected properties</p>
    </li>
    <li>
    <p>Custom properties</p>
    </li>
</ul>
<p>For a detailed summary of information that can be included in
a session, see <a href="http://docs.sun.com/app/docs/doc/819-5899/gcpii?l=zh&amp;a=view">Configuring Access Manager Sessions</a> in the <a href="http://docs.sun.com/app/docs/doc/819-5899?l=zh"><cite>Sun Java System Access Manager 7.1 Postinstallation Guide</cite></a>.</p>
<p>The Session Service also generates a session token for the new
session data structure. The <strong>session token</strong>, also
known as a <strong>sessionID</strong>, is an encrypted, unique
string that identifies the specific session instance. If the session
token is known to a protected resource such as an application, the
application can access the session and all user information contained
in it. In Access Manager, a session token is carried in a cookie.
A <strong>cookie</strong> is an information packet generated by
a web server and passed to a web browser. The fact that a web server
generates a cookie for a user does not guarantee that the user is
allowed access to protected resources. The cookie simply points to
user information in a data store from which an access decision can
be derived.</p>
<hr />
<strong>Note &#8211; </strong>
<p>Cookies are domain-specific. For example, a cookie generated
by a web server within Domain A cannot be used by a web server in
Domain B. Cookies can be passed only between servers in the same domain
in which the cookie was set. Similarly, servers can set cookies only
on servers within in their own domain.</p>
<hr />
<h1>Policy Agents</h1>
<p>Policy agents are an integral part of SSO and CDSSO sessions.
They are programs that police the web server or application server
that hosts protected resources. When a user requests access to a protected
resource such as a server or an application, the policy agent intercepts
the request and redirects it to the Access Manager Authentication
Service for authentication. Following this, the policy agent will
also enforce the authenticated user&#8217;s assigned policies. (A <strong>policy</strong> defines the rules that specify a user's access privileges
to a protected resource.) Access Manager supports two types of policy
agents:</p>
<ul>
    <li>
    <p>The <strong>web agent</strong> enforces URL-based
    policy for C applications.</p>
    </li>
    <li>
    <p>The <strong>J2EE/Java agent</strong> enforces
    URL-based policy and J2EE-based policy for Java applications on J2EE
    containers.</p>
    </li>
</ul>
<p>Both types of agents are available for you to install as programs
separate from Access Manager. For an overview of the available policy
agents and links to specific information on installation, see the <a href="http://docs.sun.com/app/docs/doc/819-2143?l=zh"><cite>Sun Java System Access Manager Policy Agent 2.2 User&#8217;s Guide</cite></a>.</p>
<hr />
<strong>Note &#8211; </strong>
<p>When Access Manager policy agents are implemented, all
HTTP requests are implicitly denied unless explicitly allowed by the
presence of two things:</p>
<ol type="1">
    <li>
    <p>A valid session</p>
    </li>
    <li>
    <p>A policy allowing access</p>
    </li>
</ol>
<p>You can modify this default configuration so that Access Manger
implicitly allows access unless explicitly denied.</p>
<hr />
<h1>Basic User Session</h1>
<p>The following sections describe the process behind a basic user
session by tracing what happens when a user logs in to a resource
protected by Access Manager. In these examples, the server which hosts
an application is protected by an Access Manager policy agent. The
Basic User Session includes the following phases:</p>
<ul>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbh?l=zh&amp;a=view">Initial HTTP Request</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbi?l=zh&amp;a=view">User Authentication</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbj?l=zh&amp;a=view">Session Validation</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbk?l=zh&amp;a=view">Policy Evaluation and Enforcement</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbl?l=zh&amp;a=view">Logging Results</a>
    </p>
    </li>
</ul>
<h2>Initial HTTP Request</h2>
<p>When a user initiates a user session by using a browser to log
in to a web-based application, the events in the following illustration
occur. The accompanying text describes the process.</p>
<h5>Figure 2&#8211;1  Initial HTTP Request</h5>
<br />
<img alt="Initial HTTP request in user session. Details
are explained in the accompanying body text." title="Initial HTTP request in user session. Details
are explained in the accompanying body text." src="http://docs.sun.com/source/819-4669/images/1-InitialRequest.gif" />
<ol type="1">
    <li>
    <p>The user&#8217;s browser sends an HTTP request to
    the protected resource.</p>
    </li>
    <li>
    <p>The policy agent inspects the user&#8217;s request
    and finds no session token.</p>
    </li>
    <li>
    <p>The policy agent contacts the configured authentication
    URL.</p>
    <p>In this example, the authentication URL it is set
    to the URL of the Distributed Authentication User Interface Service.</p>
    </li>
    <li>
    <p>The browser sends a GET request to the Distributed
    Authentication User Interface.</p>
    </li>
    <li>
    <p>The Session Service creates a new session (session
    data structure) and generates a session token. The session token is
    a randomly-generated string that represents the user.</p>
    </li>
    <li>
    <p>The Authentication Service sets the session token
    in a cookie.</p>
    </li>
</ol>
<p>The next part of the user session is User Authentication.</p>
<h2>User Authentication</h2>
<p>When the browser sends a GET request to the Distributed Authentication
User Interface, the events in the following illustration occur. The
accompanying text describes the process.</p>
<img alt="User authentication process. Details are provided
in the accompanying body text." title="User authentication process. Details are provided
in the accompanying body text." src="http://docs.sun.com/source/819-4669/images/1-Authentication.gif" />
<ol type="1">
    <li>
    <p>Using the parameters in the GET request, the Distributed
    Authentication User Interface contacts the Authentication Service
    installed on the Access Manager server.</p>
    </li>
    <li>
    <p>The Authentication Service determines the appropriate
    authentication module to use based upon Access Manager configuration
    and the request parameters passed by the Distributed Authentication
    User Interface using the Authentication client APIs.</p>
    <p>For
    example, if Access Manager is configured to use the LDAP Authentication
    type of module, the Authentication Service determines that the LDAP
    Authentication login page will be used.</p>
    </li>
    <li>
    <p>The Authentication Service determines which presentation
    callbacks should be presented, and sends to the Distributed Authentication
    User Interface all necessary credentials, requirements, and callbacks
    for use by the presentation framework layer.</p>
    </li>
    <li>
    <p>The Client Detection Service determines which protocol,
    such as HTML or WML, to use to display the login page.</p>
    </li>
    <li>
    <p>The Distributed Authentication User Interface returns
    to the Web browser a dynamic presentation extraction page along with
    the session cookie.</p>
    <p>The presentation extraction page contains
    the appropriate credentials request and callbacks info obtained from
    the Access Manager server.</p>
    </li>
    <li>
    <p>The user&#8217;s browser displays the login page.</p>
    <p>The user enters information in the Username and Password fields
    of the login page.</p>
    </li>
    <li>
    <p>The browser replies to the Distributed Authentication
    User Interface with a POST that contains the required credentials.</p>
    </li>
    <li>
    <p>The Distributed Authentication User Interface uses
    the Authentication client APIs to pass credentials to the Access Manager
    server.</p>
    </li>
    <li>
    <p>The Authentication Service uses the appropriate authentication
    module type to validate the user&#8217;s credentials. </p>
    <p>For
    example, if the LDAP authentication module type is used, the Authentication
    Service verifies that the username and password provided exist in
    the LDAP directory. Other authentication module types have different
    requirements.</p>
    </li>
    <li>
    <p>Assuming authentication is successful, the Authentication
    Service activates the session by calling the appropriate methods in
    the Session Service.</p>
    <p>The Authentication Service stores
    information such as Login time, Authentication Scheme, and Authentication
    Level in the session data structure. </p>
    </li>
    <li>
    <p>Once the session is activated, the Session Service
    changes the state of the session token to valid.</p>
    </li>
    <li>
    <p>The Distributed Authentication User Interface replies
    to the protected resource with an SSOToken in a set-cookie header.</p>
    </li>
    <li>
    <p>Now, the browser makes another request to the original
    resource protected by a policy agent.</p>
    <p>This time, the request
    includes a valid session token, created during the authentication
    process.</p>
    </li>
</ol>
<p>The next part of the user session is Session Validation.</p>
<h2>Session Validation</h2>
<p>After authentication, when the user&#8217;s browser redirects
the initial HTTP request to the server for a second time, the events
in the following illustration occur. The accompanying text describes
the process.</p>
<h5>Figure 2&#8211;2  Session Validation</h5>
<br />
<img alt="Session validation process. Details are provided
in the accompanying body text." title="Session validation process. Details are provided
in the accompanying body text." src="http://docs.sun.com/source/819-4669/images/1-SessionValidation.gif" />
<ol type="1">
    <li>
    <p>The policy agent intercepts the second access request.</p>
    <p>The request now contains a session token in the same DNS domain
    as Access Manager.</p>
    </li>
    <li>
    <p>The policy agent determines the validity of the session
    token.</p>
    <ol type="A">
        <li>
        <p>The policy agent contacts the Naming Service to learn
        where the session token originated.</p>
        <p>The Naming Service
        allows clients to find the service URL for the internal services used
        by Access Manager. This information can then be used for communication
        regarding a session.</p>
        </li>
        <li>
        <p>The Naming Service decrypts the session token and
        returns the corresponding URLs . The URLs will be used by other services
        to obtain information about the user session.</p>
        </li>
    </ol>
    </li>
    <li>
    <p>The policy agent, using the information provided by
    the Naming Service, makes a POST request to the Session Service to
    validate the included session token.</p>
    </li>
    <li>
    <p>The Session Service receives the request and determines
    whether the session token is valid based on the following criteria:</p>
    <ol type="A">
        <li>
        <p>Has the user been authenticated?</p>
        </li>
        <li>
        <p>Does a session data structure associated with the
        session token exist?</p>
        </li>
    </ol>
    </li>
    <li>
    <p>If all criteria are met, the Session Service responds
    that the session token is valid.</p>
    <p>This assertion is coupled
    with supporting information about the user session itself.</p>
    </li>
    <li>
    <p>The policy agent creates a Session Listener and registers
    the Session Listener with the Session Service. This enables notification
    to the policy agent when a change in the session token state or validity
    occurs.</p>
    </li>
</ol>
<p>The next part of the user session is Policy Evaluation.</p>
<h2>Policy Evaluation and Enforcement</h2>
<p>After a session token has been validated, the policy agent determines
if the user can be granted access to the server by evaluating it's
defined policies. The following illustration and accompanying text
describes the process.</p>
<h5>Figure 2&#8211;3  Policy Evaluation</h5>
<br />
<img alt="Policy evaluation process. Details are provided
in the accompanying body text." title="Policy evaluation process. Details are provided
in the accompanying body text." src="http://docs.sun.com/source/819-4669/images/1-PolicyEvaluation.gif" />
<ol type="1">
    <li>
    <p>The policy agent sends a request to the Policy Service.</p>
    <p>The request asks for decisions regarding resources in the policy
    agent&#8217;s portion of the HTTP namespace. The request also includes
    additional environmental information. For example, IP address or DNS
    name could be included in the request because they might impact conditions
    set on a configuration policy.</p>
    </li>
    <li>
    <p>The Policy Service checks for policies that apply
    to the request.</p>
    <p>Policies are cached in Access Manager.
    If the policies have not been cached already, then the policies are
    loaded from the Access Manager information tree in the Identity Repository.</p>
    </li>
    <li>
    <p>If policies that apply to the request are found, the
    Policy Service checks if the user identified by the session token
    is a member of any of the Policy Subjects.</p>
    <ol type="A">
        <li>
        <p>If no policies that match the resource are found,
        the user is denied access. Skip to step 5.</p>
        </li>
        <li>
        <p>If policies are found that match the resource, and
        the user is a valid subject, the Policy Service evaluates the conditions
        of each policy. For example, <strong>Is it the right time of day?</strong> or <strong>Are requests coming from the correct network?</strong>
        </p>
        <ul>
            <li>
            <p>If the conditions are met, the policy applies.</p>
            </li>
            <li>
            <p>If the conditions are not met, the policy is skipped.</p>
            </li>
        </ul>
        </li>
    </ol>
    </li>
    <li>
    <p>The Policy Service aggregates all policies that apply,
    encodes a final decision to grant or deny access, and responds to
    the policy agent with the appropriate decision.</p>
    </li>
</ol>
<p>The next part of the user session is logging the policy evaluation
results.</p>
<h2>Logging Results</h2>
<p>When the policy agent receives an allow decision from the Policy
Service, the events in the following illustration occur. The accompanying
text describes the process.</p>
<h5>Figure 2&#8211;4  Logging the Policy Evaluation Results</h5>
<br />
<img alt="Logging policy results. Details are provided
in the accompanying body text." title="Logging policy results. Details are provided
in the accompanying body text." src="http://docs.sun.com/source/819-4669/images/1-UserAuthorization.gif" />
<ol type="1">
    <li>
    <p>The allow decision is cached in the policy agent,
    along with the session token, so that subsequent requests can be checked
    using the cache.</p>
    <p>It is no longer necessary for the policy
    agent to contact Access Manager. The cache will expire after an interval
    has passed or upon an explicit notification of change in policy or
    session status. The interval is configurable.</p>
    </li>
    <li>
    <p>The policy agent issues a logging request to the Logging
    Service.</p>
    </li>
    <li>
    <p>The Logging Service logs the policy evaluation results
    to a flat file (which can be signed) or to a JDBC store, depending
    upon the log configuration.</p>
    </li>
    <li>
    <p>The Logging Service notifies the policy agent of the
    new log.</p>
    </li>
    <li>
    <p>The policy agent allows or denies the user access
    to the application.</p>
    <ol type="A">
        <li>
        <p>If the user is denied access, the policy agent displays
        an &#8220;access denied&#8221; page.</p>
        </li>
        <li>
        <p>If the user is granted access, the resource displays
        its access page.</p>
        </li>
    </ol>
    <p>Assuming the browser displays the application interface, this
    basic user session is valid until it is terminated. See <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbo?l=zh&amp;a=view">Session Termination</a>.</p>
    </li>
</ol>
<p>While the user is still logged in, if he attempts to log into
another protected resource, the Single Sign-On session begins.</p>
<h1>Single Sign-On Session</h1>
<p>SSO is always preceded by a basic user session in which a session
is created, its session token is validated, the user is authenticated,
and access is allowed. SSO begins when the authenticated user requests
a protected resource on a second server in the same DNS domain. The
following example describes an SSO session by tracing what happens
when an authenticated user accesses a second application in the same
DNS domain as the first application. Because the Session Service maintains
user session information with input from all applications participating
in an SSO session, in this example, it maintains information from
the application the user was granted access to in <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbg?l=zh&amp;a=view">Basic User Session</a>. We will assume the application
previously accessed was a corporate benefits administration application.
For this SSO session, the user is attempting access to an expense
reporting application.</p>
<h5>Figure 2&#8211;5  Single Sign-On Session</h5>
<br />
<img alt="Single sign-on session. Details are provided
in the accompanying body text." title="Single sign-on session. Details are provided
in the accompanying body text." src="http://docs.sun.com/source/819-4669/images/1-SingleSignOn.gif" />
<ol type="1">
    <li>
    <p>The user attempts to access an expense reporting application.</p>
    <p>Both the expense reporting application and the corporate
    benefits administration application are hosted on servers in the same
    domain.</p>
    </li>
    <li>
    <p>The user&#8217;s browser sends an HTTP request to
    the expense reporting application. The request includes the user&#8217;s
    session token.</p>
    </li>
    <li>
    <p>The policy agent intercepts and inspects the request
    to determine whether a session token exists.</p>
    <p>A session
    token indicates the user is already authenticated. Since the user
    was authenticated when the user logged in to the corporate benefits
    administration application, the Authentication Service is not required
    at this time. The SSO APIs retrieve the session data structure using
    the session token imbedded in the cookie. The session data structure
    is referred to as the <strong>SSOToken</strong> by the SSO APIs.
    The session token is referred to as the <strong>SSOTokenID</strong>.</p>
    </li>
    <li>
    <p>The policy agent determines the validity of the session.</p>
    <p>For detailed steps, see <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbj?l=zh&amp;a=view">Session Validation</a>.</p>
    </li>
    <li>
    <p>The Session Service sends a reply to the policy agent
    indicating whether the <strong>SSOToken</strong> is valid.</p>
    <ul>
        <li>
        <p>If the <strong>SSOToken</strong> is not valid,
        the user is redirected to the Authentication page.</p>
        </li>
        <li>
        <p>If the <strong>SSOToken</strong> is valid, the
        Session Service creates a Session Listener.</p>
        <p>A Session
        Listener allows notification to the policy agent when a change in
        the <strong>SSOToken</strong> state or validity occurs.</p>
        </li>
    </ul>
    </li>
    <li>
    <p>The policy agent sends a request to the Policy Service.</p>
    <p>The request asks for a decision regarding resources in the policy
    agent&#8217;s portion of the HTTP namespace.</p>
    </li>
    <li>
    <p>The Policy Service checks for policies that apply
    to the request.</p>
    <ul>
        <li>
        <p>If Policy Service does not find policy allowing access
        to the protected resource, the user is denied access and the following
        events occur:</p>
        <ol type="1">
            <li>
            <p>The Logging Service logs a denial of access.</p>
            </li>
            <li>
            <p>The policy agent issues a <strong>Forbidden</strong> message
            to the user.</p>
            <p>The user can then be redirected to an administrator-specified
            page indicating the user was denied access.</p>
            </li>
        </ol>
        </li>
        <li>
        <p>If the Policy Service finds policy allowing access
        to the protected resource, the user is granted access to the protected
        resource and the SSO session is valid until it is terminated. See <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbo?l=zh&amp;a=view">Session Termination</a>.</p>
        </li>
    </ul>
    </li>
</ol>
<p>While still logged in, if the user decides to attempt to log
in to another protected resource located in a different DNS domain,
Cross-Domain Single Sign-On takes place.</p>
<h1>Cross-Domain Single Sign-On Session</h1>
<p>CDSSO occurs when an authenticated user requests a protected
resource on a different server in a different DNS domain. The user
in the previous sections, <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbg?l=zh&amp;a=view">Basic User Session</a> and <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbm?l=zh&amp;a=view">Single Sign-On Session</a>, for example, accessed
applications in his company&#8217;s DNS domain. In the following example,
the same user will log in to a travel administration application supplied
to his company by an external company. The travel administration application
is hosted on the external company&#8217;s DNS domain. In this scenario,
the CDSSO Controller Service within Access Manager transfers the user&#8217;s
session information from the initial domain, making the it available
to applications in this second domain.</p>
<p>When the user logs in to the travel administration application
in the external DNS domain, the events in the following illustration
occur. The process is described in the accompanying text.</p>
<img alt="CDSSO session. Details are provided in the accompanying
body text." title="CDSSO session. Details are provided in the accompanying
body text." src="http://docs.sun.com/source/819-4669/images/1-CrossDomainSSO.gif" />
<ol type="1">
    <li>
    <p>The user&#8217;s browser sends an HTTP request to
    the travel administration application.</p>
    </li>
    <li>
    <p>The policy agent intercepts the request and inspects
    it to determine if a session token exists for the domain in which
    the travel administration application exists. One of the following
    occurs:</p>
    <ul>
        <li>
        <p>If a session token is present, the policy agent validates
        the session.</p>
        </li>
        <li>
        <p>If no session token is present, the policy agent (which
        is configured for CDSSO) redirects the HTTP request to the CDSSO Controller
        Service.</p>
        <hr />
        <strong>Note &#8211; </strong>
        <p>The CDSSO Controller Service uses Liberty Alliance Project
        protocols to transfer sessions so the relevant parameters are included
        in the redirect.</p>
        <hr />
        </li>
    </ul>
    <p>In this example, no session token for the second domain is found.</p>
    </li>
    <li>
    <p>The policy agent redirects the HTTP request to the
    CDSSO Controller Service.</p>
    </li>
    <li>
    <p>The user&#8217;s browser allows the redirect to the
    CDSSO Controller Service.</p>
    <p>Recall that earlier in the user
    session the session token was set in a cookie in the initial domain
    which is now part of the redirect.</p>
    </li>
    <li>
    <p>The CDSSO Controller Service's CDC Servlet receives
    the session token from the initial domain, extracts the user's session
    information, and formulates a Liberty POST profile response containing
    the information. The response is returned to the browser.</p>
    </li>
    <li>
    <p>The user&#8217;s browser automatically submits the
    form containing the Liberty document to the policy agent.</p>
    <p>The
    form is based upon the Action and the Javascript included in the Body
    tags <tt>onLoad</tt>.</p>
    </li>
    <li>
    <p>The policy agent receives the document, extracts the
    session information, validates the session, and sets a session token
    in the cookie for the new DNS domain.</p>
    <p>For detailed information,
    see <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbj?l=zh&amp;a=view">Session Validation</a>.</p>
    </li>
    <li>
    <p>The process continues with policy evaluation and results
    logging.</p>
    <p>See the following sections for detailed information.</p>
    <ul>
        <li>
        <p>
        <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbk?l=zh&amp;a=view">Policy Evaluation and Enforcement</a>
        </p>
        </li>
        <li>
        <p>
        <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbl?l=zh&amp;a=view">Logging Results</a>
        </p>
        </li>
    </ul>
    </li>
    <li>
    <p>The policy agent allows or denies the user access
    to the application.</p>
    <ol type="A">
        <li>
        <p>If the user is denied access, the policy agent displays
        an &#8220;access denied&#8221; page.</p>
        </li>
        <li>
        <p>If the user is granted access, the resource displays
        its access page.</p>
        </li>
    </ol>
    </li>
</ol>
<p>Assuming proper authorization, the policy agent responds to
the user by presenting the travel administration application screen.
This new cookie can now be used by all agents in the new domain, and
the session is valid until it is terminated. (See <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbo?l=zh&amp;a=view">Session Termination</a>.)</p>
<h1>Session Termination</h1>
<p>A user session can be terminated in any of following ways:</p>
<ul>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbp?l=zh&amp;a=view">User Ends Session</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbq?l=zh&amp;a=view">Administrator Ends Session</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/adrbr?l=zh&amp;a=view">Access Manager Enforces Timeout Rules</a>
    </p>
    </li>
    <li>
    <p>
    <a href="http://docs.sun.com/app/docs/doc/819-4669/gdzrf?l=zh&amp;a=view">Session Quota Constraints</a>
    </p>
    </li>
</ul>
<h2>User Ends Session</h2>
<p>When a user explicitly logs out of Access Manager by clicking
on a link to the Logout Service the following events occur:</p>
<ol type="1">
    <li>
    <p>The Logout Service receives the Logout request, and
    performs the following steps:</p>
    <ol type="A">
        <li>
        <p>Marks user&#8217;s session as destroyed.</p>
        </li>
        <li>
        <p>Destroys session.</p>
        </li>
        <li>
        <p>Returns a successful logout page to the user.</p>
        </li>
    </ol>
    </li>
    <li>
    <p>The Session Service notifies applications which are
    configured to interact with the session.</p>
    <p>In this case,
    each of the policy agents was configured for Session Notification,
    and each is sent a document instructing the agent that the session
    is now invalid.</p>
    </li>
    <li>
    <p>The policy agents flush the session from cache and
    the user session ends.</p>
    </li>
</ol>
<h2>Administrator Ends Session</h2>
<p>Access Manager administrators with appropriate permissions can
terminate a user session at any time. When an administrator uses the
Sessions tab in the Access Manager console to end a user&#8217;s session,
the following events occur:</p>
<ol type="1">
    <li>
    <p>The Logout Service receives the Logout request, and
    performs the following steps:</p>
    <ol type="A">
        <li>
        <p>Marks user&#8217;s session as destroyed.</p>
        </li>
        <li>
        <p>Destroys session.</p>
        </li>
    </ol>
    </li>
    <li>
    <p>The Session Service notifies applications which are
    configured to interact with the session.</p>
    <p>In this case,
    each of the policy agents was configured for Session Notification,
    and each is sent a document instructing the agent that the session
    is now invalid.</p>
    </li>
    <li>
    <p>The policy agents flush the session from cache and
    the user session ends.</p>
    </li>
</ol>
<h2>Access Manager Enforces Timeout Rules</h2>
<p>When a session timeout limit is reached, the Session Service
completes the following steps:</p>
<ol type="1">
    <li>
    <p>Changes session status to <tt>invalid</tt>.</p>
    </li>
    <li>
    <p>Displays time-out message to user.</p>
    </li>
    <li>
    <p>Starts timer for purge operation delay (default is
    60 minutes).</p>
    </li>
    <li>
    <p>When purge operation delay time is reached, purges
    or destroys the session.</p>
    </li>
    <li>
    <p>If a session validation request comes in after the
    purge delay time is reached, displays login page to user.</p>
    </li>
</ol>
<h2>Session Quota Constraints</h2>
<p>Access Manager allows administrators to constrain the amount
of sessions one user can have. If the user has more sessions than
the administrator will allow, one (or more) of the existing sessions
can be destroyed.</p>
<img src ="http://www.blogjava.net/sealyu/aggbug/210439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-06-25 09:21 <a href="http://www.blogjava.net/sealyu/articles/210439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML特殊字符集大全</title><link>http://www.blogjava.net/sealyu/articles/208323.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Mon, 16 Jun 2008 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/articles/208323.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/208323.html</wfw:comment><comments>http://www.blogjava.net/sealyu/articles/208323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/208323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/208323.html</trackback:ping><description><![CDATA[<h1>HTML字符实体(Character Entities)</h1>
<p>有些字符在HTML里有特别的含义，比如小于号&lt;就表示HTML Tag的开始，这个小于号是不显示在我们最终看到的网页里的。那如果我们希望在网页中显示一个小于号，该怎么办呢？</p>
<p>这就要说到HTML字符实体(HTML Character Entities)了。</p>
<p>一个字符实体(Character Entity)分成三部分：第一部分是一个&amp;符号，英文叫ampersand；第二部分是实体(Entity)名字或者是#加上实体(Entity)编号；第三部分是一个分号。</p>
<p>比如，要显示小于号，就可以写&amp;lt;或者&#60;。</p>
<p>用实体(Entity)名字的好处是比较好理解，一看lt，大概就猜出是less than的意思，但是其劣势在于并不是所有的浏览器都支持最新的Entity名字。而实体(Entity)编号，各种浏览器都能处理。</p>
<p>注意：Entity是区分大小写的。</p>
<h1>如何显示空格</h1>
<p>通常情况下，HTML会自动截去多余的空格。不管你加多少空格，都被看做一个空格。比如你在两个字之间加了10个空格，HTML会截去9个空格，只保留一个。为了在网页中增加空格，你可以使用&amp;nbsp;表示空格。</p>
<h1>最常用的字符实体(Character Entities)</h1>
<table border="0" cellpadding="1" cellspacing="1">
    <tbody>
        <tr valign="top" align="left">
            <td>显示结果 </td>
            <td>说明 </td>
            <td>Entity Name </td>
            <td>Entity Number </td>
        </tr>
        <tr valign="top" align="left">
            <td>&nbsp;</td>
            <td> 显示一个空格 </td>
            <td>&amp;nbsp;</td>
            <td>&#160;</td>
        </tr>
        <tr valign="top" align="left">
            <td>&lt;</td>
            <td>小于</td>
            <td>&amp;lt;</td>
            <td>&#60;</td>
        </tr>
        <tr valign="top" align="left">
            <td>&gt;</td>
            <td>大于 </td>
            <td>&amp;gt;</td>
            <td>&#62;</td>
        </tr>
        <tr valign="top" align="left">
            <td>&amp;</td>
            <td>&amp;符号</td>
            <td>&amp;amp;</td>
            <td>&#38;</td>
        </tr>
        <tr valign="top" align="left">
            <td>"</td>
            <td>双引号 </td>
            <td>&amp;quot;</td>
            <td>&#34;</td>
        </tr>
    </tbody>
</table>
<h1>其他常用的字符实体(Character Entities)</h1>
<table border="0" cellpadding="1" cellspacing="1">
    <tbody>
        <tr valign="top" align="left">
            <td>显示结果 </td>
            <td>说明 </td>
            <td>Entity Name </td>
            <td>Entity Number </td>
        </tr>
        <tr valign="top" align="left">
            <td>&#169; </td>
            <td>版权</td>
            <td>&amp;copy; </td>
            <td>&#169; </td>
        </tr>
        <tr valign="top" align="left">
            <td>&#174; </td>
            <td>注册商标 </td>
            <td>&amp;reg; </td>
            <td>&#174; </td>
        </tr>
        <tr valign="top" align="left">
            <td>&#215; </td>
            <td>乘号 </td>
            <td>&amp;times; </td>
            <td>&#215; </td>
        </tr>
        <tr valign="top" align="left">
            <td>&#247; </td>
            <td>除号 </td>
            <td>&amp;divide; </td>
            <td>&#247; </td>
        </tr>
    </tbody>
</table>
<h1>更多字符实体(Character Entities)</h1>
<p>更多字符实体(Character Entities)请参见 <a href="http://www.blabla.cn/ref/iso_latin_1.html">ISO Latin-1字符集</a>。</p>
<h1><br />
</h1>
<h1>ISO Latin-1字符集</h1>
<br />
<table>
    <tbody>
        <tr>
            <td>字符</td>
            <td>十进制字符编号</td>
            <td>实体名字</td>
            <td>说明</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#00;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#01;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#02;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#03;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#04;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#05;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#06;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#07;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#08;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#09;</td>
            <td>---</td>
            <td>制表符Horizontal tab</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#10;</td>
            <td>---</td>
            <td>换行Line feed</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#11;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#12;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#13;</td>
            <td>---</td>
            <td>回车Carriage Return</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#14;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#15;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#16;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#17;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#18;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#19;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#20;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#21;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#22;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#23;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#24;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#25;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#26;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#27;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#28;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#29;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#30;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#31;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&#32;</td>
            <td>---</td>
            <td>Space</td>
        </tr>
        <tr>
            <td>!</td>
            <td>&#33;</td>
            <td>---</td>
            <td>惊叹号Exclamation mark</td>
        </tr>
        <tr>
            <td>"</td>
            <td>&#34;</td>
            <td>&amp;quot;</td>
            <td>双引号Quotation mark</td>
        </tr>
        <tr>
            <td>#</td>
            <td>&#35;</td>
            <td>---</td>
            <td>数字标志Number sign</td>
        </tr>
        <tr>
            <td>$</td>
            <td>&#36;</td>
            <td>---</td>
            <td>美元标志Dollar sign</td>
        </tr>
        <tr>
            <td>%</td>
            <td>&#37;</td>
            <td>---</td>
            <td>百分号Percent sign</td>
        </tr>
        <tr>
            <td>&amp;</td>
            <td>&#38;</td>
            <td>&amp;amp;</td>
            <td>Ampersand</td>
        </tr>
        <tr>
            <td>'</td>
            <td>&#39;</td>
            <td>---</td>
            <td>单引号Apostrophe</td>
        </tr>
        <tr>
            <td>(</td>
            <td>&#40;</td>
            <td>---</td>
            <td>小括号左边部分Left parenthesis</td>
        </tr>
        <tr>
            <td>)</td>
            <td>&#41;</td>
            <td>---</td>
            <td>小括号右边部分Right parenthesis</td>
        </tr>
        <tr>
            <td>*</td>
            <td>&#42;</td>
            <td>---</td>
            <td>星号Asterisk</td>
        </tr>
        <tr>
            <td>+</td>
            <td>&#43;</td>
            <td>---</td>
            <td>加号Plus sign</td>
        </tr>
        <tr>
            <td>,</td>
            <td>&#44;</td>
            <td>---</td>
            <td>逗号Comma</td>
        </tr>
        <tr>
            <td>-</td>
            <td>&#45;</td>
            <td>---</td>
            <td>连字号Hyphen</td>
        </tr>
        <tr>
            <td>.</td>
            <td>&#46;</td>
            <td>---</td>
            <td>句号Period (fullstop)</td>
        </tr>
        <tr>
            <td>/</td>
            <td>&#47;</td>
            <td>---</td>
            <td>斜杠Solidus (slash)</td>
        </tr>
        <tr>
            <td>0</td>
            <td>&#48;</td>
            <td>---</td>
            <td>数字0 Digit 0</td>
        </tr>
        <tr>
            <td>1</td>
            <td>&#49;</td>
            <td>---</td>
            <td>数字1 Digit 1</td>
        </tr>
        <tr>
            <td>2</td>
            <td>&#50;</td>
            <td>---</td>
            <td>数字2 Digit 2</td>
        </tr>
        <tr>
            <td>3</td>
            <td>&#51;</td>
            <td>---</td>
            <td>数字3 Digit 3</td>
        </tr>
        <tr>
            <td>4</td>
            <td>&#52;</td>
            <td>---</td>
            <td>数字4 Digit 4</td>
        </tr>
        <tr>
            <td>5</td>
            <td>&#53;</td>
            <td>---</td>
            <td>数字5 Digit 5</td>
        </tr>
        <tr>
            <td>6</td>
            <td>&#54;</td>
            <td>---</td>
            <td>数字6 Digit 6</td>
        </tr>
        <tr>
            <td>7</td>
            <td>&#55;</td>
            <td>---</td>
            <td>数字7 Digit 7</td>
        </tr>
        <tr>
            <td>8</td>
            <td>&#56;</td>
            <td>---</td>
            <td>数字8 Digit 8</td>
        </tr>
        <tr>
            <td>9</td>
            <td>&#57;</td>
            <td>---</td>
            <td>数字9 Digit 9</td>
        </tr>
        <tr>
            <td>:</td>
            <td>&#58;</td>
            <td>---</td>
            <td>冒号Colon</td>
        </tr>
        <tr>
            <td>;</td>
            <td>&#59;</td>
            <td>---</td>
            <td>分号Semicolon</td>
        </tr>
        <tr>
            <td>&lt;</td>
            <td>&#60;</td>
            <td>&amp;lt;</td>
            <td>小于号Less than</td>
        </tr>
        <tr>
            <td>=</td>
            <td>&#61;</td>
            <td>---</td>
            <td>等于符号Equals sign</td>
        </tr>
        <tr>
            <td>&gt;</td>
            <td>&#62;</td>
            <td>&amp;gt;</td>
            <td>大于号Greater than</td>
        </tr>
        <tr>
            <td>?</td>
            <td>&#63;</td>
            <td>---</td>
            <td>问号Question mark</td>
        </tr>
        <tr>
            <td>@</td>
            <td>&#64;</td>
            <td>---</td>
            <td>Commercial at</td>
        </tr>
        <tr>
            <td>A</td>
            <td>&#65;</td>
            <td>---</td>
            <td>大写A Capital A</td>
        </tr>
        <tr>
            <td>B</td>
            <td>&#66;</td>
            <td>---</td>
            <td>大写B Capital B</td>
        </tr>
        <tr>
            <td>C</td>
            <td>&#67;</td>
            <td>---</td>
            <td>大写C Capital C</td>
        </tr>
        <tr>
            <td>D</td>
            <td>&#68;</td>
            <td>---</td>
            <td>大写D Capital D</td>
        </tr>
        <tr>
            <td>E</td>
            <td>&#69;</td>
            <td>---</td>
            <td>大写E Capital E</td>
        </tr>
        <tr>
            <td>F</td>
            <td>&#70;</td>
            <td>---</td>
            <td>大写F Capital F</td>
        </tr>
        <tr>
            <td>G</td>
            <td>&#71;</td>
            <td>---</td>
            <td>大写G Capital G</td>
        </tr>
        <tr>
            <td>H</td>
            <td>&#72;</td>
            <td>---</td>
            <td>大写H Capital H</td>
        </tr>
        <tr>
            <td>I</td>
            <td>&#73;</td>
            <td>---</td>
            <td>大写J Capital I</td>
        </tr>
        <tr>
            <td>J</td>
            <td>&#74;</td>
            <td>---</td>
            <td>大写K Capital J</td>
        </tr>
        <tr>
            <td>K</td>
            <td>&#75;</td>
            <td>---</td>
            <td>大写L Capital K</td>
        </tr>
        <tr>
            <td>L</td>
            <td>&#76;</td>
            <td>---</td>
            <td>大写K Capital L</td>
        </tr>
        <tr>
            <td>M</td>
            <td>&#77;</td>
            <td>---</td>
            <td>大写M Capital M</td>
        </tr>
        <tr>
            <td>N</td>
            <td>&#78;</td>
            <td>---</td>
            <td>大写N Capital N</td>
        </tr>
        <tr>
            <td>O</td>
            <td>&#79;</td>
            <td>---</td>
            <td>大写O Capital O</td>
        </tr>
        <tr>
            <td>P</td>
            <td>&#80;</td>
            <td>---</td>
            <td>大写P Capital P</td>
        </tr>
        <tr>
            <td>Q</td>
            <td>&#81;</td>
            <td>---</td>
            <td>大写Q Capital Q</td>
        </tr>
        <tr>
            <td>R</td>
            <td>&#82;</td>
            <td>---</td>
            <td>大写R Capital R</td>
        </tr>
        <tr>
            <td>S</td>
            <td>&#83;</td>
            <td>---</td>
            <td>大写S Capital S</td>
        </tr>
        <tr>
            <td>T</td>
            <td>&#84;</td>
            <td>---</td>
            <td>大写T Capital T</td>
        </tr>
        <tr>
            <td>U</td>
            <td>&#85;</td>
            <td>---</td>
            <td>大写U Capital U</td>
        </tr>
        <tr>
            <td>V</td>
            <td>&#86;</td>
            <td>---</td>
            <td>大写V Capital V</td>
        </tr>
        <tr>
            <td>W</td>
            <td>&#87;</td>
            <td>---</td>
            <td>大写W Capital W</td>
        </tr>
        <tr>
            <td>X</td>
            <td>&#88;</td>
            <td>---</td>
            <td>大写X Capital X</td>
        </tr>
        <tr>
            <td>Y</td>
            <td>&#89;</td>
            <td>---</td>
            <td>大写Y Capital Y</td>
        </tr>
        <tr>
            <td>Z</td>
            <td>&#90;</td>
            <td>---</td>
            <td>大写Z Capital Z</td>
        </tr>
        <tr>
            <td>[</td>
            <td>&#91;</td>
            <td>---</td>
            <td>中括号左边部分Left square bracket</td>
        </tr>
        <tr>
            <td>"</td>
            <td>&#92;</td>
            <td>---</td>
            <td>反斜杠Reverse solidus (backslash)</td>
        </tr>
        <tr>
            <td>]</td>
            <td>&#93;</td>
            <td>---</td>
            <td>中括号右边部分Right square bracket</td>
        </tr>
        <tr>
            <td>^</td>
            <td>&#94;</td>
            <td>---</td>
            <td>Caret</td>
        </tr>
        <tr>
            <td>_</td>
            <td>&#95;</td>
            <td>---</td>
            <td>下划线Horizontal bar (underscore)</td>
        </tr>
        <tr>
            <td>`</td>
            <td>&#96;</td>
            <td>---</td>
            <td>尖重音符Acute accent</td>
        </tr>
        <tr>
            <td>a</td>
            <td>&#97;</td>
            <td>---</td>
            <td>小写a Small a</td>
        </tr>
        <tr>
            <td>b</td>
            <td>&#98;</td>
            <td>---</td>
            <td>小写b Small b</td>
        </tr>
        <tr>
            <td>c</td>
            <td>&#99;</td>
            <td>---</td>
            <td>小写c Small c</td>
        </tr>
        <tr>
            <td>d</td>
            <td>&#100;</td>
            <td>---</td>
            <td>小写d Small d</td>
        </tr>
        <tr>
            <td>e</td>
            <td>&#101;</td>
            <td>---</td>
            <td>小写e Small e</td>
        </tr>
        <tr>
            <td>f</td>
            <td>&#102;</td>
            <td>---</td>
            <td>小写f Small f</td>
        </tr>
        <tr>
            <td>g</td>
            <td>&#103;</td>
            <td>---</td>
            <td>小写g Small g</td>
        </tr>
        <tr>
            <td>h</td>
            <td>&#104;</td>
            <td>---</td>
            <td>小写h Small h</td>
        </tr>
        <tr>
            <td>i</td>
            <td>&#105;</td>
            <td>---</td>
            <td>小写i Small i</td>
        </tr>
        <tr>
            <td>j</td>
            <td>&#106;</td>
            <td>---</td>
            <td>小写j Small j</td>
        </tr>
        <tr>
            <td>k</td>
            <td>&#107;</td>
            <td>---</td>
            <td>小写k Small k</td>
        </tr>
        <tr>
            <td>l</td>
            <td>&#108;</td>
            <td>---</td>
            <td>小写l Small l</td>
        </tr>
        <tr>
            <td>m</td>
            <td>&#109;</td>
            <td>---</td>
            <td>小写m Small m</td>
        </tr>
        <tr>
            <td>n</td>
            <td>&#110;</td>
            <td>---</td>
            <td>小写n Small n</td>
        </tr>
        <tr>
            <td>o</td>
            <td>&#111;</td>
            <td>---</td>
            <td>小写o Small o</td>
        </tr>
        <tr>
            <td>p</td>
            <td>&#112;</td>
            <td>---</td>
            <td>小写p Small p</td>
        </tr>
        <tr>
            <td>q</td>
            <td>&#113;</td>
            <td>---</td>
            <td>小写q Small q</td>
        </tr>
        <tr>
            <td>r</td>
            <td>&#114;</td>
            <td>---</td>
            <td>小写r Small r</td>
        </tr>
        <tr>
            <td>s</td>
            <td>&#115;</td>
            <td>---</td>
            <td>小写s Small s</td>
        </tr>
        <tr>
            <td>t</td>
            <td>&#116;</td>
            <td>---</td>
            <td>小写t Small t</td>
        </tr>
        <tr>
            <td>u</td>
            <td>&#117;</td>
            <td>---</td>
            <td>小写u Small u</td>
        </tr>
        <tr>
            <td>v</td>
            <td>&#118;</td>
            <td>---</td>
            <td>小写v Small v</td>
        </tr>
        <tr>
            <td>w</td>
            <td>&#119;</td>
            <td>---</td>
            <td>小写w Small w</td>
        </tr>
        <tr>
            <td>x</td>
            <td>&#120;</td>
            <td>---</td>
            <td>小写x Small x</td>
        </tr>
        <tr>
            <td>y</td>
            <td>&#121;</td>
            <td>---</td>
            <td>小写y Small y</td>
        </tr>
        <tr>
            <td>z</td>
            <td>&#122;</td>
            <td>---</td>
            <td>小写z Small z</td>
        </tr>
        <tr>
            <td>{</td>
            <td>&#123;</td>
            <td>---</td>
            <td>大括号左边部分Left curly brace</td>
        </tr>
        <tr>
            <td>|</td>
            <td>&#124;</td>
            <td>---</td>
            <td>竖线Vertical bar</td>
        </tr>
        <tr>
            <td>}</td>
            <td>&#125;</td>
            <td>---</td>
            <td>大括号右边部分Right curly brace</td>
        </tr>
        <tr>
            <td>~</td>
            <td>&#126;</td>
            <td>---</td>
            <td>Tilde</td>
        </tr>
        <tr>
            <td>---</td>
            <td>&#127;</td>
            <td>---</td>
            <td>未使用Unused</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&#160;</td>
            <td>&amp;nbsp;</td>
            <td>空格Nonbreaking space</td>
        </tr>
        <tr>
            <td>&#161;</td>
            <td>&#161;</td>
            <td>&amp;iexcl;</td>
            <td>Inverted exclamation</td>
        </tr>
        <tr>
            <td>&#162;</td>
            <td>&#162;</td>
            <td>&amp;cent;</td>
            <td>货币分标志Cent sign</td>
        </tr>
        <tr>
            <td>&#163;</td>
            <td>&#163;</td>
            <td>&amp;pound;</td>
            <td>英镑标志Pound sterling</td>
        </tr>
        <tr>
            <td>&#164;</td>
            <td>&#164;</td>
            <td>&amp;curren;</td>
            <td>通用货币标志General currency sign</td>
        </tr>
        <tr>
            <td>&#165;</td>
            <td>&#165;</td>
            <td>&amp;yen;</td>
            <td>日元标志Yen sign</td>
        </tr>
        <tr>
            <td>&#166;</td>
            <td>&#166;</td>
            <td>&amp;brvbar; or &amp;brkbar;</td>
            <td>断竖线Broken vertical bar</td>
        </tr>
        <tr>
            <td>&#167;</td>
            <td>&#167;</td>
            <td>&amp;sect;</td>
            <td>分节号Section sign</td>
        </tr>
        <tr>
            <td>&#168;</td>
            <td>&#168;</td>
            <td>&amp;uml; or &amp;die;</td>
            <td>变音符号Umlaut</td>
        </tr>
        <tr>
            <td>&#169;</td>
            <td>&#169;</td>
            <td>&amp;copy;</td>
            <td>版权标志Copyright</td>
        </tr>
        <tr>
            <td>&#170;</td>
            <td>&#170;</td>
            <td>&amp;ordf;</td>
            <td>Feminine ordinal</td>
        </tr>
        <tr>
            <td>&#171;</td>
            <td>&#171;</td>
            <td>&amp;laquo;</td>
            <td>Left angle quote, guillemet left</td>
        </tr>
        <tr>
            <td>&#172;</td>
            <td>&#172;</td>
            <td>&amp;not</td>
            <td>Not sign</td>
        </tr>
        <tr>
            <td>&#173;</td>
            <td>&#173;</td>
            <td>&amp;shy;</td>
            <td>Soft hyphen</td>
        </tr>
        <tr>
            <td>&#174;</td>
            <td>&#174;</td>
            <td>&amp;reg;</td>
            <td>注册商标标志Registered trademark</td>
        </tr>
        <tr>
            <td>&#175;</td>
            <td>&#175;</td>
            <td>&amp;macr; or &amp;hibar;</td>
            <td>长音符号Macron accent</td>
        </tr>
        <tr>
            <td>&#176;</td>
            <td>&#176;</td>
            <td>&amp;deg;</td>
            <td>度数标志Degree sign</td>
        </tr>
        <tr>
            <td>&#177;</td>
            <td>&#177;</td>
            <td>&amp;plusmn;</td>
            <td>加或减Plus or minus</td>
        </tr>
        <tr>
            <td>&#178;</td>
            <td>&#178;</td>
            <td>&amp;sup2;</td>
            <td>上标2 Superscript two</td>
        </tr>
        <tr>
            <td>&#179;</td>
            <td>&#179;</td>
            <td>&amp;sup3;</td>
            <td>上标3 Superscript three</td>
        </tr>
        <tr>
            <td>&#180;</td>
            <td>&#180;</td>
            <td>&amp;acute;</td>
            <td>尖重音符Acute accent</td>
        </tr>
        <tr>
            <td>&#181;</td>
            <td>&#181;</td>
            <td>&amp;micro;</td>
            <td>Micro sign</td>
        </tr>
        <tr>
            <td>&#182;</td>
            <td>&#182;</td>
            <td>&amp;para;</td>
            <td>Paragraph sign</td>
        </tr>
        <tr>
            <td>&#183;</td>
            <td>&#183;</td>
            <td>&amp;middot;</td>
            <td>Middle dot</td>
        </tr>
        <tr>
            <td>&#184;</td>
            <td>&#184;</td>
            <td>&amp;cedil;</td>
            <td>Cedilla</td>
        </tr>
        <tr>
            <td>&#185;</td>
            <td>&#185;</td>
            <td>&amp;sup1;</td>
            <td>上标1 Superscript one</td>
        </tr>
        <tr>
            <td>&#186;</td>
            <td>&#186;</td>
            <td>&amp;ordm;</td>
            <td>Masculine ordinal</td>
        </tr>
        <tr>
            <td>&#187;</td>
            <td>&#187;</td>
            <td>&amp;raquo;</td>
            <td>Right angle quote, guillemet right</td>
        </tr>
        <tr>
            <td>&#188;</td>
            <td>&#188;</td>
            <td>&amp;frac14;</td>
            <td>四分之一Fraction one-fourth</td>
        </tr>
        <tr>
            <td>&#189;</td>
            <td>&#189;</td>
            <td>&amp;frac12;</td>
            <td>二分之一Fraction one-half</td>
        </tr>
        <tr>
            <td>&#190;</td>
            <td>&#190;</td>
            <td>&amp;frac34;</td>
            <td>四分之三Fraction three-fourths</td>
        </tr>
        <tr>
            <td>&#191;</td>
            <td>&#191;</td>
            <td>&amp;iquest;</td>
            <td>Inverted question mark</td>
        </tr>
        <tr>
            <td>&#192;</td>
            <td>&#192;</td>
            <td>&amp;Agrave;</td>
            <td>Capital A, grave accent</td>
        </tr>
        <tr>
            <td>&#193;</td>
            <td>&#193;</td>
            <td>&amp;Aacute;</td>
            <td>Capital A, acute accent</td>
        </tr>
        <tr>
            <td>&#194;</td>
            <td>&#194;</td>
            <td>&amp;Acirc;</td>
            <td>Capital A, circumflex</td>
        </tr>
        <tr>
            <td>&#195;</td>
            <td>&#195;</td>
            <td>&amp;Atilde;</td>
            <td>Capital A, tilde</td>
        </tr>
        <tr>
            <td>&#196;</td>
            <td>&#196;</td>
            <td>&amp;Auml;</td>
            <td>Capital A, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#197;</td>
            <td>&#197;</td>
            <td>&amp;Aring;</td>
            <td>Capital A, ring</td>
        </tr>
        <tr>
            <td>&#198;</td>
            <td>&#198;</td>
            <td>&amp;AElig;</td>
            <td>Capital AE ligature</td>
        </tr>
        <tr>
            <td>&#199;</td>
            <td>&#199;</td>
            <td>&amp;Ccedil;</td>
            <td>Capital C, cedilla</td>
        </tr>
        <tr>
            <td>&#200;</td>
            <td>&#200;</td>
            <td>&amp;Egrave;</td>
            <td>Capital E, grave accent</td>
        </tr>
        <tr>
            <td>&#201;</td>
            <td>&#201;</td>
            <td>&amp;Eacute;</td>
            <td>Capital E, acute accent</td>
        </tr>
        <tr>
            <td>&#202;</td>
            <td>&#202;</td>
            <td>&amp;Ecirc;</td>
            <td>Capital E, circumflex</td>
        </tr>
        <tr>
            <td>&#203;</td>
            <td>&#203;</td>
            <td>&amp;Euml;</td>
            <td>Capital E, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#204;</td>
            <td>&#204;</td>
            <td>&amp;Igrave;</td>
            <td>Capital I, grave accent</td>
        </tr>
        <tr>
            <td>&#205;</td>
            <td>&#205;</td>
            <td>&amp;Iacute;</td>
            <td>Capital I, acute accent</td>
        </tr>
        <tr>
            <td>&#206;</td>
            <td>&#206;</td>
            <td>&amp;Icirc;</td>
            <td>Capital I, circumflex</td>
        </tr>
        <tr>
            <td>&#207;</td>
            <td>&#207;</td>
            <td>&amp;Iuml;</td>
            <td>Capital I, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#208;</td>
            <td>&#208;</td>
            <td>&amp;ETH;</td>
            <td>Capital Eth, Icelandic</td>
        </tr>
        <tr>
            <td>&#209;</td>
            <td>&#209;</td>
            <td>&amp;Ntilde;</td>
            <td>Capital N, tilde</td>
        </tr>
        <tr>
            <td>&#210;</td>
            <td>&#210;</td>
            <td>&amp;Ograve;</td>
            <td>Capital O, grave accent</td>
        </tr>
        <tr>
            <td>&#211;</td>
            <td>&#211;</td>
            <td>&amp;Oacute;</td>
            <td>Capital O, acute accent</td>
        </tr>
        <tr>
            <td>&#212;</td>
            <td>&#212;</td>
            <td>&amp;Ocirc;</td>
            <td>Capital O, circumflex</td>
        </tr>
        <tr>
            <td>&#213;</td>
            <td>&#213;</td>
            <td>&amp;Otilde;</td>
            <td>Capital O, tilde</td>
        </tr>
        <tr>
            <td>&#214;</td>
            <td>&#214;</td>
            <td>&amp;Ouml;</td>
            <td>Capital O, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#215;</td>
            <td>&#215;</td>
            <td>&amp;times;</td>
            <td>乘号Multiply sign</td>
        </tr>
        <tr>
            <td>&#216;</td>
            <td>&#216;</td>
            <td>&amp;Oslash;</td>
            <td>Capital O, slash</td>
        </tr>
        <tr>
            <td>&#217;</td>
            <td>&#217;</td>
            <td>&amp;Ugrave;</td>
            <td>Capital U, grave accent</td>
        </tr>
        <tr>
            <td>&#218;</td>
            <td>&#218;</td>
            <td>&amp;Uacute;</td>
            <td>Capital U, acute accent</td>
        </tr>
        <tr>
            <td>&#219;</td>
            <td>&#219;</td>
            <td>&amp;Ucirc;</td>
            <td>Capital U, circumflex</td>
        </tr>
        <tr>
            <td>&#220;</td>
            <td>&#220;</td>
            <td>&amp;Uuml;</td>
            <td>Capital U, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#221;</td>
            <td>&#221;</td>
            <td>&amp;Yacute;</td>
            <td>Capital Y, acute accent</td>
        </tr>
        <tr>
            <td>&#222;</td>
            <td>&#222;</td>
            <td>&amp;THORN;</td>
            <td>Capital Thorn, Icelandic</td>
        </tr>
        <tr>
            <td>&#223;</td>
            <td>&#223;</td>
            <td>&amp;szlig;</td>
            <td>Small sharp s, German sz</td>
        </tr>
        <tr>
            <td>&#224;</td>
            <td>&#224;</td>
            <td>&amp;agrave;</td>
            <td>Small a, grave accent</td>
        </tr>
        <tr>
            <td>&#225;</td>
            <td>&#225;</td>
            <td>&amp;aacute;</td>
            <td>Small a, acute accent</td>
        </tr>
        <tr>
            <td>&#226;</td>
            <td>&#226;</td>
            <td>&amp;acirc;</td>
            <td>Small a, circumflex</td>
        </tr>
        <tr>
            <td>&#227;</td>
            <td>&#227;</td>
            <td>&amp;atilde;</td>
            <td>Small a, tilde</td>
        </tr>
        <tr>
            <td>&#228;</td>
            <td>&#228;</td>
            <td>&amp;auml;</td>
            <td>Small a, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#229;</td>
            <td>&#229;</td>
            <td>&amp;aring;</td>
            <td>Small a, ring</td>
        </tr>
        <tr>
            <td>&#230;</td>
            <td>&#230;</td>
            <td>&amp;aelig;</td>
            <td>Small ae ligature</td>
        </tr>
        <tr>
            <td>&#231;</td>
            <td>&#231;</td>
            <td>&amp;ccedil;</td>
            <td>Small c, cedilla</td>
        </tr>
        <tr>
            <td>&#232;</td>
            <td>&#232;</td>
            <td>&amp;egrave;</td>
            <td>Small e, grave accent</td>
        </tr>
        <tr>
            <td>&#233;</td>
            <td>&#233;</td>
            <td>&amp;eacute;</td>
            <td>Small e, acute accent</td>
        </tr>
        <tr>
            <td>&#234;</td>
            <td>&#234;</td>
            <td>&amp;ecirc;</td>
            <td>Small e, circumflex</td>
        </tr>
        <tr>
            <td>&#235;</td>
            <td>&#235;</td>
            <td>&amp;euml;</td>
            <td>Small e, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#236;</td>
            <td>&#236;</td>
            <td>&amp;igrave;</td>
            <td>Small i, grave accent</td>
        </tr>
        <tr>
            <td>&#237;</td>
            <td>&#237;</td>
            <td>&amp;iacute;</td>
            <td>Small i, acute accent</td>
        </tr>
        <tr>
            <td>&#238;</td>
            <td>&#238;</td>
            <td>&amp;icirc;</td>
            <td>Small i, circumflex</td>
        </tr>
        <tr>
            <td>&#239;</td>
            <td>&#239;</td>
            <td>&amp;iuml;</td>
            <td>Small i, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#240;</td>
            <td>&#240;</td>
            <td>&amp;eth;</td>
            <td>Small eth, Icelandic</td>
        </tr>
        <tr>
            <td>&#241;</td>
            <td>&#241;</td>
            <td>&amp;ntilde;</td>
            <td>Small n, tilde</td>
        </tr>
        <tr>
            <td>&#242;</td>
            <td>&#242;</td>
            <td>&amp;ograve;</td>
            <td>Small o, grave accent</td>
        </tr>
        <tr>
            <td>&#243;</td>
            <td>&#243;</td>
            <td>&amp;oacute;</td>
            <td>Small o, acute accent</td>
        </tr>
        <tr>
            <td>&#244;</td>
            <td>&#244;</td>
            <td>&amp;ocirc;</td>
            <td>Small o, circumflex</td>
        </tr>
        <tr>
            <td>&#245;</td>
            <td>&#245;</td>
            <td>&amp;otilde;</td>
            <td>Small o, tilde</td>
        </tr>
        <tr>
            <td>&#246;</td>
            <td>&#246;</td>
            <td>&amp;ouml;</td>
            <td>Small o, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#247;</td>
            <td>&#247;</td>
            <td>&amp;divide;</td>
            <td>除号Division sign</td>
        </tr>
        <tr>
            <td>&#248;</td>
            <td>&#248;</td>
            <td>&amp;oslash;</td>
            <td>Small o, slash</td>
        </tr>
        <tr>
            <td>&#249;</td>
            <td>&#249;</td>
            <td>&amp;ugrave;</td>
            <td>Small u, grave accent</td>
        </tr>
        <tr>
            <td>&#250;</td>
            <td>&#250;</td>
            <td>&amp;uacute;</td>
            <td>Small u, acute accent</td>
        </tr>
        <tr>
            <td>&#251;</td>
            <td>&#251;</td>
            <td>&amp;ucirc;</td>
            <td>Small u, circumflex</td>
        </tr>
        <tr>
            <td>&#252;</td>
            <td>&#252;</td>
            <td>&amp;uuml;</td>
            <td>Small u, di?esis / umlaut</td>
        </tr>
        <tr>
            <td>&#253;</td>
            <td>&#253;</td>
            <td>&amp;yacute;</td>
            <td>Small y, acute accent</td>
        </tr>
        <tr>
            <td>&#254;</td>
            <td>&#254;</td>
            <td>&amp;thorn;</td>
            <td>Small thorn, Icelandic</td>
        </tr>
        <tr>
            <td>&#255;</td>
            <td>&#255;</td>
            <td>&amp;yuml;</td>
            <td>Small y, umlaut</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/sealyu/aggbug/208323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-06-16 14:32 <a href="http://www.blogjava.net/sealyu/articles/208323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入了解CSS（层叠样式表）的继承性及其应用</title><link>http://www.blogjava.net/sealyu/articles/206098.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 05 Jun 2008 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/articles/206098.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/206098.html</wfw:comment><comments>http://www.blogjava.net/sealyu/articles/206098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/206098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/206098.html</trackback:ping><description><![CDATA[<strong>编者：</strong>所谓CSS的<strong>继承</strong>是指被包在内部的标签将拥有外部标签的样式性质。继承特性
最典型的应用通常发挥在整个网页的样式预设，需要指定为其它样式的部份设定在个别元素里即可。这项特性可以给网页设计者提供更理想的发挥空间。但同时继承
也有很多规则，应用的时候容易让人迷惑，donger今天就专门和大家聊聊这方面的应用。<br />
<br />
正文<br />
<br />
CSS是层叠样式表（Cascading Style Sheets）的简称，它的规范代表了互联网历史上一个独特的发展阶段。现在对于从事网页制作的朋友来说，很少没有听说过CSS了吧，因为在制作网页过程中我们经常需要用到。<br />
<br />
CSS允许我们为文档设置更为丰富且便于修改的外观，可以减轻网页设计者的工作负担。这里我们主要想和朋友们一起对CSS的继承性和特殊性进行一点深入的探讨。
<p>　　<strong><font color="#990000">一、继承</font></strong></p>
<p>　　CSS的一个主要特征就是继承，它是依赖于祖先-后代的关系的。继承是一种机制，它允许样式不仅可以应用于某个特定的元素，还可以应用于它的后代。例如一个BODY定义了的颜色值也会应用到段落的文本中。下面举例说明：</p>
<p>　　<strong>样式定义：</strong>body{color:red;}</p>
<p>　　<strong>应用举例代码：</strong></p>
<p>CSS的<strong>层叠和继承</strong>深入探讨</p>
<p>　　<strong>应用举例效果：</strong><img src="http://photo.sohu.com/20040713/Img220987021.gif" v:shapes="_x0000_i1025" border="1" height="92" width="279"  alt="" /> <br />
</p>
<p>　　这段代码的应用结果是：&#8220;CSS的层叠和继承深入探讨&#8221;这段话是红颜色的，&#8220;层叠和继承&#8221;由于应用了strong元素，所以是粗体。这很符合制作者的意图，也是为什么继承是CSS的一部分的原因。<br />
<br />
<strong><font color="#990000">二、CSS继承的局限性</font></strong> </p>
<p>　　在CSS中，继承是一种非常自然的行为，我们甚至不需要考虑是否能够这样去做，但是继承也有其局限性。</p>
<p>　　首先，有些属性是不能继承的。这没有任何原因，只是因为它就是这么设置的。举个例子来说：border属性，大家都知道，border属性是用
来设置元素的边框的，它就没有继承性。如下图所示，如果继承了边框属性，那么文档看起来就会很奇怪，除非采取另外的措施关掉边框的继承属性。</p>
<p>　　 <img src="http://photo.sohu.com/20040713/Img220987022.gif" v:shapes="_x0000_i1026" border="1" height="330" width="377"  alt="" /> </p>
<p>　　如上图所示，多数边框类属性，比如象Padding（补白），Margin（边界），背景和边框的属性都是不能继承的。</p>
<p><span><strong><font color="#990000">三、继承中容易引起的错误</font></strong>
<p>　　有时候继承也会带来些错误，比如说下面这条CSS定义：</p>
<p>　　Body{color:blue}</p>
<p>　　在有些浏览器中这句定义会使除表格之外的文本变成蓝色。从技术上来说，这是不正确的，但是它确实存在。所以我们经常需要借助于某些技巧，比如将CSS定义成这样：</p>
<p>　　Body,table,th,td{color:blue}</p>
<p>　　这样表格内的文字也会变成蓝色。</p>
<p>　　<strong><font color="#990000">四、多种样式混合应用</font></strong></p>
<p>　　既然有了继承性，那么在样式表中的应用上可能会有些读者搞不清，多个样式表同时应用到一个对象上会发生什么情形呢？先举个简单的例子：</p>
<p>　　<strong>样式定义：</strong>.apple{color:red;}　　H1{color:yellow;}</p>
<p>　　<strong>应用举例代码：</strong>&lt;H1 CLASS=&#8221;apple&#8221;&gt;这儿的苹果好红啊&lt;/H1&gt;</p>
<p>　　<strong>应用举例效果</strong>：因为选择符H1和.apple都匹配上面的H1元素，那么到底浏览器会应用哪一个呢？通过在浏览器中观察，我们发现这段文字应用了.apple这个样式，所以它显示的是红色。这是因为两条规则的特殊性不一样，CSS规则必须这样进行处理。</p>
<p>　　 <img src="http://photo.sohu.com/20040713/Img220987026.gif" v:shapes="_x0000_i1027" border="1" height="92" width="279"  alt="" /> </p>
<p>　　样式表中的特殊性描述了不同规则的相对权重，它的基本规则是：</p>
<p>　　统计选择符中的ID属性个数。 <br />
统计选择符中的CLASS属性个数。 <br />
统计选择符中的HTML标记名格式。 </p>
<p>　　最后，按正确的顺序写出三个数字，不要加空格或逗号，得到一个三位数。( 注意，你需要将数字转换成一个以三个数字结尾的更大的数)。相应于选择符的最终数字列表可以很容易确定较高数字特性凌驾于较低数字的。</p>
<p>　　以下是一个按特性分类的选择符的列表：</p>
<p>　　H1 {color:blue;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：1<br />
P EM {color:purple;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：2<br />
.apple {red;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：10&nbsp;<br />
P.bright {color:yellow;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：11<br />
P.bright EM.dark {color:brown;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：22<br />
#id316 {color:yellow}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：100</p>
<p>　　从上表我们可以看出#id316具有更高的特殊性，因而它有更高的权重。当有多个规则都能应用于同一个元素时，权重越高的样式将被优先采用。</p>
</span></p>
<span><strong><font color="#990000">五、CSS继承的优先级问题</font></strong>
<p>　　上面我们讨论了CSS的继承性和特殊性，在特殊性的框架下，被继承的特性值为0，这就意味着任何显示声明的规则将会覆盖其继承样式。因此，不管一条规则具有多高的权重，如果没有其他规则能应用于这个继承元素，那么它也只是个被继承的规则而已，举例说明。</p>
<p>　　<strong>样式定义：BODY {background:black;}<br />
LI {color:gray;}<br />
UL.white {color:white}<br />
<br />
<strong>应用举例代码：</strong><br />
&lt;ul&gt;<br />
&lt;li&gt;举例列表一&lt;/li&gt;<br />
&lt;li&gt;举例列表二&lt;/li&gt;<br />
&lt;li&gt;举例列表三&lt;/li&gt;<br />
&lt;li&gt;举例列表四&lt;/li&gt;<br />
&lt;/ul&gt;<br />
<br />
<strong>应用举例效果：</strong> </strong></p>
<p><strong>　　 <img src="http://photo.sohu.com/20040713/Img220987027.gif" v:shapes="_x0000_i1028" border="1" height="119" width="179"  alt="" /> </strong></p>
<p><strong>　　有些读者可能认为除包含.white类的列表项显示为白色外，其余所有的列表项都应该是灰色的。然而情况并非如此。</strong></p>
<p><strong>　　为什么会出现这样的情况呢？因为带选择符LI的显式声明的权值比从UL.white规则那里继承过来的权值要大，所以每个列表项都是灰色的。</strong></p>
<p><strong>　　可能有些地方不是很好理解，大家多思考一下就会明白，平时在应用样式表的时候多留意思考一下。</strong></p>
<p><strong>　　下面我们再来看一个例子，若给定如下所示的标记，则EM强调文字将会是灰色的，而非黑色，因为EM规则的权值要大于从H1元素继承来的权值：<br />
<br />
<strong>样式定义：</strong> <br />
H1#id316 {color:black;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：101<br />
EM {color:gray;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：1<br />
<br />
<strong>应用举例代码：</strong><br />
&lt;H1 ID=&#8221;id316&#8221;&gt;深入探讨&lt;EM&gt;CSS的继承性&lt;/EM&gt;&lt;/H1&gt;<br />
<br />
<strong>应用举例效果</strong>： </strong></p>
<p><strong>　　 <img src="http://photo.sohu.com/20040713/Img220987029.gif" v:shapes="_x0000_i1029" border="1" height="77" width="378"  alt="" /> </strong></p>
<p><strong>　　这是因为第二条EM规则的特性值（1）要比被继承的特性值（0）要大，事实上规定H1#id316的原始特性值（101）对其继承值没有影响，仍旧为0。</strong></p>
<p><strong>　　<strong>小技巧：</strong></strong></p>
<p><strong>　　如果想让H1始终为黑色，而EM文字在其他情况下红色，那么下面的样式表设置就是一个很好的方法：</strong></p>
<p><strong>　　H1，H1 EM {color:black;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;特性值为：1，2<br />
EM {color:red;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特性值为：1</strong></p>
<p><strong>　　给定这个规则后，除在H1元素内的任何EM文字就都是红色，而H1内的EM文字仍旧为黑色，由于其选择符分组，在第一条规则中就有两条有效的规则（一条是对H1的，另一条是对H1 EM的）也就有两个特性值??每条规则一个。</strong></p>
<p><strong>　　上面我们讨论了多个样式规则同时应用于同一对象时，哪个规则会被最终应用的一些情况，可能有些细心的读者会说，那STYLE元素呢？对啊，HTML代码中可以直接应用内联样式STYLE的嘛。那么它的特性值如何呢？</strong></p>
<p><strong>　　回答是这样的：带有STYLE的元素在CSS1下其特性值为100，尽管类似于#ID316这样的ID选择符的特性值也为100，但在实际应用
中，STYLE这一权值会更高一些，因为STYLE元素的值看起来要比多数普通规则的权值大。所以我们可以看出内联样式具有高的特性值，具体的例子我们就
不举了，大家可以自己试试。</strong></p>
<p><span><strong><font color="#990000">六、人为定义CSS继承优先级<br />
<br />
</font></strong>
在制作网页的过程中，我们可能想要设置某个规则比其他的规则更重要，CSS中允许这样设置，它们被称为重要规则（important
rule）。这是根据其声明的方式和它们的自然属性来命名的。通过在一条规则的分号前插入！important这样一个短语来标记一条重要规则，比如说：
<p>　　P.apple {color:#red !important; background:white;}</p>
<p>　　颜色值#red被标记为!important，而背景色white未被标记，如果需要二条规则都是重要的话，那么每条规则都需要标上!important。</p>
<p>　　正确地放置!important的位置是很重要的，否则整条规则将为无效。!important总是放在规则声明的最后，在分号之前。</p>
<p>　　标记为!important的规则具有最高的权值，也就是说他没有具体的特性值，但是比其他的权值都要大。需要注意的是，虽然制作者定义的样式
比用户定义的样式具有更高权值时，但!important规则恰恰相反：重要的用户定义规则要比制作者定义的样式具有更高权值，即使是标记为!
important的重要规则也是如此。</p>
<p>　　看了这么多文字介绍后，我们来举个例子看一下：<br />
<br />
<strong>样式定义：</strong><br />
H1 {color:gray !important;}<br />
<br />
<strong>应用举例代码：　　&lt;H1 STYLE=&#8221;color:black;&#8221;&gt;看这儿！&lt;/H1&gt;<br />
<br />
<strong>应用举例效果</strong>:<br />
!important规则会覆盖内联STYLE属性的内容，所以结果文字是灰色的而不是黑色的。</strong></p>
<p><strong>　　 <img src="http://photo.sohu.com/20040713/Img220987030.gif" v:shapes="_x0000_i1030" border="1" height="92" width="279"  alt="" /> </strong></p>
<p><strong>　　还有最后一种需要考虑的情况：继承值总是具有特性值0的特点，即使是从带有!important的规则继承的值也是如此，在匹配重要规则的元素之外，重要性也会随之消失，这点是需要我们特别注意的！</strong></p>
</span></p>
</span>
<img src ="http://www.blogjava.net/sealyu/aggbug/206098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-06-05 17:11 <a href="http://www.blogjava.net/sealyu/articles/206098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用HttpClient来模拟浏览器GET POST（转载）</title><link>http://www.blogjava.net/sealyu/articles/192012.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 10 Apr 2008 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/articles/192012.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/192012.html</wfw:comment><comments>http://www.blogjava.net/sealyu/articles/192012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/192012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/192012.html</trackback:ping><description><![CDATA[<h1><strong>用HttpClient来模拟浏览器GET&nbsp;POST</strong></h1>
<h2>作者:jaddy0302 日期:2006-12-21</h2>
<div>
<div>字体大小: <a accesskey="1" href="javascript:SetFont('12px')">小</a> <a accesskey="2" href="javascript:SetFont('14px')">中</a> <a accesskey="3" href="javascript:SetFont('16px')">大</a></div>
<div><img style="margin: 0px 2px -6px 0px;" alt="" src="http://www.360doc.com/DownloadImg/16749/327716_1.gif" /><img alt="" src="http://www.360doc.com/DownloadImg/16749/327716_2.gif" /> <img style="margin: 0px 2px -1px 0px;" alt="" src="http://www.360doc.com/DownloadImg/16749/327716_3.gif" /> </div>
</div>
<p><font size="4">一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器，用来浏览页面查看信息或者提交
一些数据等等。所访问的这些页面有的仅仅是一些普通的页面，有的需要用户登录后方可使用，或者需要认证以及是一些通过加密方式传输，例如HTTPS。目前
我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面，比如从别人的网页中&#8220;偷&#8221;一些数据；利用某些站点
提供的页面来完成某种功能，例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据，因此只好借助其他公司已有的网站来完成这个功能，这个时候
我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面，那我们的程序会很简单，本文也就没有必要大张旗鼓
的在这里浪费口舌。但是考虑到一些服务授权的问题，很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的，而必须经过注册然后登录后方可使
用提供服务的页面，这个时候就涉及到COOKIE问题的处理。我们知道目前流行的***页技术例如ASP、JSP无不是通过COOKIE来处理会话信息
的。为了使我们的程序能使用别人所提供的服务页面，就要求程序首先登录后再访问服务页面，这过程就需要自行处理cookie，想想当你用
java.net.HttpURLConnection来完成这些功能时是多么恐怖的事情啊！况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的
&#8220;顽固&#8221;！再有如通过HTTP来上传文件呢？不需要头疼，这些问题有了&#8220;它&#8221;就很容易解决了！ </font></p>
<p><font size="4">我们不可能列举所有可能的顽固，我们会针对几种最常见的问题进行处理。当然了，正如前面说到的，如果我们自己使用
java.net.HttpURLConnection来搞定这些问题是很恐怖的事情，因此在开始之前我们先要介绍一下一个开放源码的项目，这个项目就是
Apache开源组织中的httpclient，它隶属于Jakarta的commons项目，目前的版本是2.0RC2。commons下本来已经有一
个net的子项目，但是又把httpclient单独提出来，可见http服务器的访问绝非易事。</font></p>
<p><font size="4">Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以
让原来很头疼的事情现在轻松的解决，例如你不再管是HTTP或者HTTPS的通讯方式，告诉它你想使用HTTPS方式，剩下的事情交给
httpclient替你完成。本文会针对我们在编写HTTP客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient来解决它们，为了
让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容，然后循序渐进解决掉前进中的所形侍狻?/font&gt;
</font></p>
<p><font size="4"><font size="4">1． 读取网页(HTTP/HTTPS)内容</font></font></p>
<p><font size="4"><font size="4">下面是我们给出的一个简单的例子用来访问某个页面</font></font></p>
<p><font size="4"><font size="4">/*</font></font></p>
<p><font size="4"><font size="4">&nbsp;* Created on 2003-12-14 by Liudong</font></font></p>
<p><font size="4"><font size="4">&nbsp;*/</font></font></p>
<p><font size="4"><font size="4">package http.demo;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">import java.io.IOException;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.*;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.methods.*;</font></font></p>
<p><font size="4"><font size="4">/**</font></font></p>
<p><font size="4"><font size="4">&nbsp;* 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面</font></font></p>
<p><font size="4"><font size="4">&nbsp;* @author Liudong</font></font></p>
<p><font size="4"><font size="4">&nbsp;*/</font></font></p>
<p><font size="4"><font size="4">public class SimpleClient {</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置代理服务器地址和端口&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用GET方法，如果服务器需要通过HTTPS连接，那只需要将下面URL中的http换成https</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpMethod method = new GetMethod("</font><a href="http://java.sun.com/"><font size="4">http://java.sun.com</font></a><font size="4">"); </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用POST方法</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //HttpMethod method = new PostMethod("</font><a href="http://java.sun.com/"><font size="4">http://java.sun.com</font></a><font size="4">"); </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(method);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印服务器返回的状态</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getStatusLine());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印返回的信息</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getResponseBodyAsString());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //释放连接</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.releaseConnection();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; }<br />
}</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">在这个例子中首先创建一个HTTP客户端(HttpClient)的实例，然后选择
提交的方法是GET或者POST，最后在HttpClient实例上执行提交的方法，最后从所选择的提交方法中读取服务器反馈回来的结果。这就是使用
HttpClient的基本流程。其实用一行代码也就可以搞定整个请求的过程，非常的简单！</font></font></p>
<p><font size="4"><br />
<font size="4">2． 以GET或者POST方式向网页提交参数</font></font></p>
<p><font size="4"><font size="4">其实前面一个最简单的示例中我们已经介绍了如何使用GET或者POST方式来请求一
个页面，本小节与之不同的是多了提交时设定页面所需的参数，我们知道如果是GET的请求方式，那么所有参数都直接放到页面的URL后面用问号与页面地址隔
开，每个参数用&amp;隔开，例如：</font><a href="http://java.sun.com/?name=liudong&amp;mobile=123456"><font size="4">http://java.sun.com?name=liudong&amp;mobile=123456</font></a><font size="4">，但是当使用POST方法时就会稍微有一点点麻烦。本小节的例子演示向如何查询手机号码所在的城市，代码如下：</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">/*</font></font></p>
<p><font size="4"><font size="4">&nbsp;* Created on 2003-12-7 by Liudong</font></font></p>
<p><font size="4"><font size="4">&nbsp;*/</font></font></p>
<p><font size="4"><font size="4">package http.demo;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">import java.io.IOException;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.*;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.methods.*;</font></font></p>
<p><font size="4"><font size="4">/**</font></font></p>
<p><font size="4"><font size="4">&nbsp;* 提交参数演示</font></font></p>
<p><font size="4"><font size="4">&nbsp;* 该程序连接到一个用于查询手机号码所属地的页面</font></font></p>
<p><font size="4"><font size="4">&nbsp;* 以便查询号码段1330227所在的省份以及城市</font></font></p>
<p><font size="4"><font size="4">&nbsp;* @author Liudong</font></font></p>
<p><font size="4"><font size="4">&nbsp;*/</font></font></p>
<p><font size="4"><font size="4">public class SimpleHttpClient {</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getHostConfiguration().setHost("</font><a href="http://www.imobile.com.cn/"><font size="4">www.imobile.com.cn</font></a><font size="4">", 80, "http");</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpMethod method = getPostMethod();//使用POST方式提交数据</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(method);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印服务器返回的状态</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getStatusLine());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印结果页面</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String response =</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new String(method.getResponseBodyAsString().getBytes("8859_1"));</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印返回的信息</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(response);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.releaseConnection();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; /**</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; * 使用GET方式提交数据</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; * @return</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; */</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; private static HttpMethod getGetMethod(){</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new GetMethod("/simcard.php?simcard=1330227");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; /**</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; * 使用POST方式提交数据</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; * @return</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; */</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; private static HttpMethod getPostMethod(){</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod("/simcard.php");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair simcard = new NameValuePair("simcard","1330227");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new NameValuePair[] { simcard});</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return post;</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">}</font></font></p>
<p><font size="4"><font size="4">在上面的例子中页面</font><a href="http://www.imobile.com.cn/simcard.php"><font size="4">http://www.imobile.com.cn/simcard.php</font></a><font size="4">需要一个参数是simcard，这个参数值为手机号码段，即手机号码的前七位，服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息，而POST则需要通过NameValuePair类来设置参数名称和它所对应的值</font></font></p>
<p><font size="4"><font size="4">3． 处理页面重定向</font></font></p>
<p><font size="4"><font size="4">在JSP/Servlet编程中response.sendRedirect方法就
是使用HTTP协议中的重定向机制。它与JSP中的&lt;jsp:forward
&#8230;&gt;的区别在于后者是在服务器中实现页面的跳转，也就是说应用容器加载了所要跳转的页面的内容并返回给客户端；而前者是返回一个状态码，这些状态码
的可能值见下表，然后客户端读取需要跳转到的页面的URL并重新加载新的页面。就是这样一个过程，所以我们编程的时候就要通过
HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。如果已经确认需要进行页面跳转了，那么可
以通过读取HTTP头中的location属性来获取新的地址。</font></font></p>
<p><font size="4"><font size="4">状态码<br />
&nbsp;对应HttpServletResponse的常量<br />
&nbsp;详细描述<br />
&nbsp;<br />
301<br />
&nbsp;SC_MOVED_PERMANENTLY<br />
&nbsp;页面已经永久移到另外一个新地址<br />
&nbsp;<br />
302<br />
&nbsp;SC_MOVED_TEMPORARILY<br />
&nbsp;页面暂时移动到另外一个新的地址<br />
&nbsp;<br />
303<br />
&nbsp;SC_SEE_OTHER<br />
&nbsp;客户端请求的地址必须通过另外的URL来访问<br />
&nbsp;<br />
307<br />
&nbsp;SC_TEMPORARY_REDIRECT<br />
&nbsp;同SC_MOVED_TEMPORARILY<br />
&nbsp;</font></font></p>
<p><font size="4"><br />
<font size="4">下面的代码片段演示如何处理页面的重定向</font></font></p>
<p><font size="4"><font size="4">client.executeMethod(post);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getStatusLine().toString()); </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查是否重定向</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int statuscode = post.getStatusCode();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) ||</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) ||</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (statuscode == HttpStatus.SC_SEE_OTHER) ||</font></font></p>
<p><font size="4"><font size="4">(statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {</font></font></p>
<p><font size="4"><font size="4">//读取新的URL地址</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header header = post.getResponseHeader("location");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (header != null) {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String newuri = header.getValue();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((newuri == null) || (newuri.equals("")))</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newuri = "/"; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod redirect = new GetMethod(newuri);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(redirect);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Redirect:"+ redirect.getStatusLine().toString()); </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirect.releaseConnection();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Invalid redirect");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">我们可以自行编写两个JSP页面，其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。</font></font></p>
<p><font size="4"><font size="4">4． 模拟输入用户名和口令进行登录</font></font></p>
<p><font size="4"><font size="4">本小节应该说是HTTP客户端编程中最常碰见的问题，很多网站的内容都只是对注册用
户可见的，这种情况下就必须要求使用正确的用户名和口令登录成功后，方可浏览到想要的页面。因为HTTP协议是无状态的，也就是连接的有效期只限于当前请
求，请求内容结束后连接就关闭了。在这种情况下为了保存用户的登录信息必须使用到Cookie机制。以JSP/Servlet为例，当浏览器请求一个
JSP或者是Servlet的页面时，应用服务器会返回一个参数，名为jsessionid（因不同应用服务器而异），值是一个较长的唯一字符串的
Cookie，这个字符串值也就是当前访问该站点的会话标识。浏览器在每访问该站点的其他页面时候都要带上jsessionid这样的Cookie信息，
应用服务器根据读取这个会话标识来获取对应的会话信息。</font></font></p>
<p><font size="4"><font size="4">对于需要用户登录的网站，一般在用户登录成功后会将用户资料保存在服务器的会话中，
这样当访问到其他的页面时候，应用服务器根据浏览器送上的Cookie中读取当前请求对应的会话标识以获得对应的会话信息，然后就可以判断用户资料是否存
在于会话信息中，如果存在则允许访问页面，否则跳转到登录页面中要求用户输入帐号和口令进行登录。这就是一般使用JSP开发网站在处理用户登录的比较通用
的方法。</font></font></p>
<p><font size="4"><font size="4">这样一来，对于HTTP的客户端来讲，如果要访问一个受保护的页面时就必须模拟浏览
器所做的工作，首先就是请求登录页面，然后读取Cookie值；再次请求登录页面并加入登录页所需的每个参数；最后就是请求最终所需的页面。当然在除第一
次请求外其他的请求都需要附带上Cookie信息以便服务器能判断当前请求是否已经通过验证。说了这么多，可是如果你使用httpclient的话，你甚
至连一行代码都无需增加，你只需要先传递登录信息执行登录过程，然后直接访问想要的页面，跟访问一个普通的页面没有任何区别，因为类HttpClient
已经帮你做了所有该做的事情了，太棒了！下面的例子实现了这样一个访问的过程。</font></font></p>
<p><font size="4"><br />
<font size="4">/*</font></font></p>
<p><font size="4"><font size="4">&nbsp;* Created on 2003-12-7 by Liudong</font></font></p>
<p><font size="4"><font size="4">&nbsp;*/</font></font></p>
<p><font size="4"><font size="4">package http.demo;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.*;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.cookie.*;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.methods.*;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">/**</font></font></p>
<p><font size="4"><font size="4">&nbsp;* 用来演示登录表单的示例</font></font></p>
<p><font size="4"><font size="4">&nbsp;* @author Liudong</font></font></p>
<p><font size="4"><font size="4">&nbsp;*/</font></font></p>
<p><font size="4"><font size="4">public class FormLoginDemo {</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; static final String LOGON_SITE = "localhost";</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; static final int&nbsp;&nbsp;&nbsp; LOGON_PORT = 8080;</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception{</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模拟登录页面login.jsp-&gt;main.jsp</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod("/main.jsp");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair name = new NameValuePair("name", "ld");&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair pass = new NameValuePair("password", "ld");&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new NameValuePair[]{name,pass});</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status = client.executeMethod(post);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getResponseBodyAsString());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection();&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看cookie信息</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CookieSpec cookiespec = CookiePolicy.getDefaultSpec();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cookies.length == 0) {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("None");&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; cookies.length; i++) {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(cookies[i].toString());&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //访问所需的页面main2.jsp</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod get = new GetMethod("/main2.jsp");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(get);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(get.getResponseBodyAsString());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.releaseConnection();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">}</font></font></p>
<p><font size="4"><font size="4">5． 提交XML格式参数</font></font></p>
<p><font size="4"><font size="4">提交XML格式的参数很简单，仅仅是一个提交时候的ContentType问题，下面的例子演示从文件文件中读取XML信息并提交给服务器的过程，该过程可以用来测试Web服务。</font></font></p>
<p><font size="4"><font size="4">import java.io.File;</font></font></p>
<p><font size="4"><font size="4">import java.io.FileInputStream;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.HttpClient;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.methods.EntityEnclosingMethod;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.methods.PostMethod;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">/**</font></font></p>
<p><font size="4"><font size="4">&nbsp;* 用来演示提交XML格式数据的例子</font></font></p>
<p><font size="4"><font size="4">&nbsp;*/</font></font></p>
<p><font size="4"><font size="4">public class PostXMLClient {</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File input = new File(&#8220;test.xml&#8221;);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod(&#8220;http://localhost:8080/httpclient/xml.jsp&#8221;);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置请求的内容直接从文件中读取</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new FileInputStream(input));</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (input.length() &lt; Integer.MAX_VALUE) </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestContentLength(input.length());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 指定请求内容的类型</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestHeader("Content-type", "text/xml; charset=GBK");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient httpclient = new HttpClient(); </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result = httpclient.executeMethod(post); </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Response status code: " + result);</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Response body: ");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getResponseBodyAsString());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">}</font></font></p>
<p><font size="4"><font size="4">6． 通过HTTP上传文件</font></font></p>
<p><font size="4"><font size="4">httpclient使用了单独的一个HttpMethod子类来处理文件的上传，这个类就是MultipartPostMethod，该类已经封装了文件上传的细节，我们要做的仅仅是告诉它我们要上传文件的全路径即可，下面的代码片段演示如何使用这个类。</font></font></p>
<p><font size="4"><font size="4">MultipartPostMethod filePost = new MultipartPostMethod(targetURL);</font></font></p>
<p><font size="4"><font size="4">filePost.addParameter("fileName", targetFilePath);</font></font></p>
<p><font size="4"><font size="4">HttpClient client = new HttpClient();</font></font></p>
<p><font size="4"><font size="4">//由于要上传的文件可能比较大,因此在此设置最大的连接超时时间</font></font></p>
<p><font size="4"><font size="4">client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);</font></font></p>
<p><font size="4"><font size="4">int status = client.executeMethod(filePost);</font></font></p>
<p><font size="4"><br />
<font size="4">上面代码中，targetFilePath即为要上传的文件所在的路径。</font></font></p>
<p><font size="4"><font size="4">7． 访问启用认证的页面</font></font></p>
<p><font size="4"><font size="4">我们经常会碰到这样的页面，当访问它的时候会弹出一个浏览器的对话框要求输入用户名
和密码后方可，这种用户认证的方式不同于我们在前面介绍的基于表单的用户身份验证。这是HTTP的认证策略，httpclient支持三种认证方式包括：
基本、摘要以及NTLM认证。其中基本认证最简单、通用但也最不安全；摘要认证是在HTTP
1.1中加入的认证方式，而NTLM则是微软公司定义的而不是通用的规范，最新版本的NTLM是比摘要认证还要安全的一种方式。</font></font></p>
<p><font size="4"><font size="4">下面例子是从httpclient的CVS服务器中下载的，它简单演示如何访问一个认证保护的页面：</font></font></p>
<p><font size="4"><br />
<font size="4">import org.apache.commons.httpclient.HttpClient;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.UsernamePasswordCredentials;</font></font></p>
<p><font size="4"><font size="4">import org.apache.commons.httpclient.methods.GetMethod;</font></font></p>
<p><font size="4"><font size="4">&nbsp;</font></font></p>
<p><font size="4"><font size="4">public class BasicAuthenticationExample {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; public BasicAuthenticationExample() {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getState().setCredentials(</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "</font><a href="http://www.verisign.com/"><font size="4">www.verisign.com</font></a><font size="4">",</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "realm",</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new UsernamePasswordCredentials("username", "password")</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod get = new GetMethod("</font><a href="https://www.verisign.com/products/index.html"><font size="4">https://www.verisign.com/products/index.html</font></a><font size="4">");</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.setDoAuthentication( true );</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status = client.executeMethod( get );</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(status+""+ get.getResponseBodyAsString());</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.releaseConnection();</font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font size="4"><font size="4">}</font></font></p>
<p><font size="4"><font size="4">8． 多线程模式下使用httpclient</font></font></p>
<p><font size="4"><font size="4">多线程同时访问httpclient，例如同时从一个站点上下载多个文件。对于同一
个HttpConnection同一个时间只能有一个线程访问，为了保证多线程工作环境下不产生冲突，httpclient使用了一个多线程连接管理器的
类：MultiThreadedHttpConnectionManager，要使用这个类很简单，只需要在构造HttpClient实例的时候传入即
可，代码如下：</font></font></p>
<p><font size="4"><font size="4">MultiThreadedHttpConnectionManager connectionManager = </font></font></p>
<p><font size="4"><font size="4">&nbsp;&nbsp; new MultiThreadedHttpConnectionManager();</font></font></p>
<p><font size="4"><font size="4">HttpClient client = new HttpClient(connectionManager);</font></font></p>
<p><font size="4"><font size="4">以后尽管访问client实例即可。</font></font></p>
<p><font size="4"><font size="4">参考资料：</font></font></p>
<font size="4"><font size="4">httpclient首页：&nbsp;&nbsp;&nbsp; </font><a href="http://jakarta.apache.org/commons/httpclient/"><font size="4">http://jakarta.apache.org/commons/httpclient/</font></a><br />
<font size="4">关于NTLM是如何工作：&nbsp; </font><a href="http://davenport.sourceforge.net/ntlm.html"><font size="4">http://davenport.sourceforge.net/ntlm.html</font></a></font>
<img src ="http://www.blogjava.net/sealyu/aggbug/192012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-04-10 22:57 <a href="http://www.blogjava.net/sealyu/articles/192012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对FckEditor编辑器在MAXTHON浏览器下选择服务器文件对话框显示不正常的改进 -...（转载）</title><link>http://www.blogjava.net/sealyu/articles/192009.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 10 Apr 2008 14:53:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/articles/192009.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/192009.html</wfw:comment><comments>http://www.blogjava.net/sealyu/articles/192009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/192009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/192009.html</trackback:ping><description><![CDATA[用过FckEditor的朋友都知道，它的选择图片对话框中&#8220;浏览服
务器&#8221;按钮。点击该按钮可以浏览以前已经上传过的文件。不过这个按钮点击后弹出的对话框在MAXTHON浏览器下是以标签形式打开的，这样模态对话框就始
终显示在了浏览文件窗口之前，要想选择文件得先关掉模态对话框。先前有朋友提出把弹出模态对话框的功能改为ShowModlessDialog，这个终究
不是解决之道，现将我的解决方法写下来与大家分享：<br />
思路就是基于IE内核的浏览器采用模态对话框弹出浏览服务器窗口，其他的仍然window.open不变
1:修改"fckeditor"editor"dialog"common"fck_dialog_common.js<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">&nbsp;OpenFileBrowser(&nbsp;url,&nbsp;width,&nbsp;height&nbsp;)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;oEditor&nbsp;must&nbsp;be&nbsp;defined.</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;iLeft&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(&nbsp;oEditor.FCKConfig.ScreenWidth&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;width&nbsp;)&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span>&nbsp;<span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;iTop&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(&nbsp;oEditor.FCKConfig.ScreenHeight&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;height&nbsp;)&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span>&nbsp;<span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;sOptions&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span>&nbsp;<span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">toolbar=no,status=no,resizable=no,dependent=yes,scrollbars=yes</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;sOptions&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span>&nbsp;<span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,width=</span><span style="color: rgb(0, 0, 0);">"</span>&nbsp;<span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;width&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;sOptions&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span>&nbsp;<span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,height=</span><span style="color: rgb(0, 0, 0);">"</span>&nbsp;<span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;height&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;sOptions&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span>&nbsp;<span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,left=</span><span style="color: rgb(0, 0, 0);">"</span>&nbsp;<span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;iLeft&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;sOptions&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span>&nbsp;<span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,top=</span><span style="color: rgb(0, 0, 0);">"</span>&nbsp;<span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;iTop&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;The&nbsp;"PreserveSessionOnFileBrowser"&nbsp;because&nbsp;the&nbsp;above&nbsp;code&nbsp;could&nbsp;be</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;blocked&nbsp;by&nbsp;popup&nbsp;blockers.</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(&nbsp;oEditor.FCKConfig.PreserveSessionOnFileBrowser&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;oEditor.FCKBrowserInfo.IsIE&nbsp;)<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;The&nbsp;following&nbsp;change&nbsp;has&nbsp;been&nbsp;made&nbsp;otherwise&nbsp;IE&nbsp;will&nbsp;open&nbsp;the&nbsp;file</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;browser&nbsp;on&nbsp;a&nbsp;different&nbsp;server&nbsp;session&nbsp;(on&nbsp;some&nbsp;cases):</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;http://support.microsoft.com/default.aspx?scid=kb;en-us;831678</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;by&nbsp;Simone&nbsp;Chiaretta.</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;oWindow&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;oEditor.window.open(&nbsp;url,&nbsp;'FCKBrowseWindow',&nbsp;sOptions&nbsp;)&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(&nbsp;oWindow&nbsp;)<br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Detect&nbsp;Yahoo&nbsp;popup&nbsp;blocker.</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;sTest&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;oWindow.name&nbsp;;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Yahoo&nbsp;returns&nbsp;"something",&nbsp;but&nbsp;we&nbsp;can't&nbsp;access&nbsp;it,&nbsp;so&nbsp;detect&nbsp;that&nbsp;and&nbsp;avoid&nbsp;strange&nbsp;errors&nbsp;for&nbsp;the&nbsp;user.</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oWindow.opener&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;window&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">(e)<br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&nbsp;oEditor.FCKLang.BrowseServerBlocked&nbsp;)&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">38</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&nbsp;oEditor.FCKLang.BrowseServerBlocked&nbsp;)&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">39</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">40</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">41</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里是修改部分<br />
</span><span style="color: rgb(0, 128, 128);">42</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(oEditor.FCKBrowserInfo.IsIE)<br />
</span><span style="color: rgb(0, 128, 128);">43</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">44</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.showModalDialog(url</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&amp;rdm=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Date(),window,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">status:false;dialogWidth:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">width</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">px;dialogHeight:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">height</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">px"</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">45</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">46</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
</span><span style="color: rgb(0, 128, 128);">47</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">48</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.open(&nbsp;url,&nbsp;'FCKBrowseWindow',&nbsp;sOptions&nbsp;)&nbsp;;<br />
</span><span style="color: rgb(0, 128, 128);">49</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">50</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">51</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
2:修改"fckeditor"editor"filemanager"browser"default"frmresourceslist.html<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">&nbsp;OpenFile(&nbsp;fileUrl&nbsp;)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(&nbsp;window.dialogArguments)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.dialogArguments.SetUrl(&nbsp;fileUrl&nbsp;)&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.close()&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.dialogArguments.focus()&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.top.opener.SetUrl(&nbsp;fileUrl&nbsp;)&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.top.close()&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.top.opener.focus()&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<img src ="http://www.blogjava.net/sealyu/aggbug/192009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-04-10 22:53 <a href="http://www.blogjava.net/sealyu/articles/192009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>css属性列表 和 属性值含义  （转载）</title><link>http://www.blogjava.net/sealyu/articles/192006.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 10 Apr 2008 14:50:00 GMT</pubDate><guid>http://www.blogjava.net/sealyu/articles/192006.html</guid><wfw:comment>http://www.blogjava.net/sealyu/comments/192006.html</wfw:comment><comments>http://www.blogjava.net/sealyu/articles/192006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sealyu/comments/commentRss/192006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sealyu/services/trackbacks/192006.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: css属性列表                                                                                                属性名称                                                字体属性（Font）             ...&nbsp;&nbsp;<a href='http://www.blogjava.net/sealyu/articles/192006.html'>阅读全文</a><img src ="http://www.blogjava.net/sealyu/aggbug/192006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sealyu/" target="_blank">seal</a> 2008-04-10 22:50 <a href="http://www.blogjava.net/sealyu/articles/192006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>