FileDocCategorySizeDatePackage
CookieInterceptor.javaAPI DocExample11354Mon Jul 23 13:26:52 BST 2007org.apache.struts2.interceptor

CookieInterceptor

public class CookieInterceptor extends com.opensymphony.xwork2.interceptor.AbstractInterceptor
The aim of this interceptor is to set values in the stack/action based on cookie name/value of interest.

If an asterik is present in cookiesName parameter, it will be assume that all cookies name are to be injected into struts' action, even though cookiesName is comma-separated by other values, eg (cookie1,*,cookie2).

If cookiesName is left empty it will assume that no cookie will be injected into Struts' action.

If an asterik is present in cookiesValue parameter, it will assume that all cookies name irrespective of its value will be injected into Struts' action so long as the cookie name matches those specified in cookiesName parameter.

If cookiesValue is left empty it will assume that all cookie that match the cookieName parameter will be injected into Struts' action.

The action could implements {@link CookiesAware} in order to have a {@link Map} of filtered cookies set into it.

  • cookiesName (mandatory) - Name of cookies to be injected into the action. If more than one cookie name is desired it could be comma-separated. If all cookies name is desired, it could simply be *, an asterik. When many cookies name are comma-separated either of the cookie that match the name in the comma-separated list will be qualified.
  • cookiesValue (mandatory) - Value of cookies that if its name matches cookieName attribute and its value matched this, will be injected into Struts' action. If more than one cookie name is desired it could be comma-separated. If left empty, it will assume any value would be ok. If more than one value is specified (comma-separated) it will assume a match if either value is matched.
    populateCookieValueIntoStack - this method will decide if this cookie value is qualified to be populated into the value stack (hence into the action itself) injectIntoCookiesAwareAction - this method will inject selected cookies (as a java.util.Map) into action that implements {@link CookiesAware}.


<!--
This example will inject cookies named either 'cookie1' or 'cookie2' whose
value could be either 'cookie1value' or 'cookie2value' into Struts' action.
-->
<action ... >
<interceptor-ref name="cookie">
<param name="cookiesName">cookie1, cookie2</param>
<param name="cookiesValue">cookie1value, cookie2value</param>
</interceptor-ref>
....
</action>


<!--
This example will inject cookies named either 'cookie1' or 'cookie2'
regardless of their value into Struts' action.
-->
<action ... >
<interceptor-ref name="cookie">
<param name="cookiesName">cookie1, cookie2</param>
<param name="cookiesValue">*</param>
<interceptor-ref>
...
</action>


<!--
This example will inject cookies named either 'cookie1' with value
'cookie1value' or 'cookie2' with value 'cookie2value' into Struts'
action.
-->
<action ... >
<interceptor-ref name="cookie">
<param name="cookiesName">cookie1</param>
<param name="cookiesValue">cookie1value</param>
</interceptor-ref>
<interceptor-ref name="cookie">
<param name="cookiesName"<cookie2</param>
<param name="cookiesValue">cookie2value</param>
</interceptor-ref>
....
</action>

<!--
This example will inject any cookies regardless of its value into
Struts' action.
-->
<action ... >
<interceptor-ref name="cookie">
<param name="cookiesName">*</param>
<param name="cookiesValue">*</param>
</interceptor-ref>
...
</action>


see
CookiesAware

Fields Summary
private static final long
serialVersionUID
private static final Log
LOG
private Set
cookiesNameSet
private Set
cookiesValueSet
Constructors Summary
Methods Summary
protected voidinjectIntoCookiesAwareAction(java.lang.Object action, java.util.Map cookiesMap)
Hook that set the cookiesMap into action that implements {@link CookiesAware}.

param
action
param
cookiesMap

        if (action instanceof CookiesAware) {
            if (LOG.isDebugEnabled())
                LOG.debug("action ["+action+"] implements CookiesAware, injecting cookies map ["+cookiesMap+"]");
            ((CookiesAware)action).setCookiesMap(cookiesMap);
        }
    
public java.lang.Stringintercept(com.opensymphony.xwork2.ActionInvocation invocation)


        if (LOG.isDebugEnabled())
            LOG.debug("start interception");

        final ValueStack stack = ActionContext.getContext().getValueStack();
        HttpServletRequest request = ServletActionContext.getRequest();

        // contains selected cookies
        Map cookiesMap = new LinkedHashMap();

        Cookie cookies[] = request.getCookies();
        if (cookies != null) {
            for (int a=0; a< cookies.length; a++) {
                String name = cookies[a].getName();
                String value = cookies[a].getValue();

                if (cookiesNameSet.contains("*")) {
                    if (LOG.isDebugEnabled())
                        LOG.debug("contains cookie name [*] in configured cookies name set, cookie with name ["+name+"] with value ["+value+"] will be injected");
                    populateCookieValueIntoStack(name, value, cookiesMap, stack);
                }
                else if (cookiesNameSet.contains(cookies[a].getName())) {
                    populateCookieValueIntoStack(name, value, cookiesMap, stack);
                }
            }
        }

        injectIntoCookiesAwareAction(invocation.getAction(), cookiesMap);

        return invocation.invoke();
    
protected voidpopulateCookieValueIntoStack(java.lang.String cookieName, java.lang.String cookieValue, java.util.Map cookiesMap, com.opensymphony.xwork2.util.ValueStack stack)
Hook that populate cookie value into value stack (hence the action) if the criteria is satisfied (if the cookie value matches with those configured).

param
cookieName
param
cookieValue
param
cookiesMap
param
stack

        if (cookiesValueSet.isEmpty() || cookiesValueSet.contains("*")) {
            // If the interceptor is configured to accept any cookie value
            // OR
            // no cookiesValue is defined, so as long as the cookie name match
            // we'll inject it into Struts' action
            if (LOG.isDebugEnabled()) {
                if (cookiesValueSet.isEmpty())
                    LOG.debug("no cookie value is configured, cookie with name ["+cookieName+"] with value ["+cookieValue+"] will be injected");
                else if (cookiesValueSet.contains("*"))
                    LOG.debug("interceptor is configured to accept any value, cookie with name ["+cookieName+"] with value ["+cookieValue+"] will be injected");
            }
            cookiesMap.put(cookieName, cookieValue);
            stack.setValue(cookieName, cookieValue);
        }
        else {
            // if cookiesValues is specified, the cookie's value must match before we
            // inject them into Struts' action
            if (cookiesValueSet.contains(cookieValue)) {
                if (LOG.isDebugEnabled())
                    LOG.debug("both configured cookie name and value matched, cookie ["+cookieName+"] with value ["+cookieValue+"] will be injected");
                cookiesMap.put(cookieName, cookieValue);
                stack.setValue(cookieName, cookieValue);
            }
        }
    
public voidsetCookiesName(java.lang.String cookiesName)
Set the cookiesName which if matche will allow the cookie to be injected into action, could be comma-separated string.

param
cookiesName


                              
        
        if (cookiesName != null)
            this.cookiesNameSet = TextParseUtil.commaDelimitedStringToSet(cookiesName);
    
public voidsetCookiesValue(java.lang.String cookiesValue)
Set the cookiesValue which if matched (together with matching cookiesName) will caused the cookie to be injected into action, could be comma-separated string.

param
cookiesValue

        if (cookiesValue != null)
            this.cookiesValueSet = TextParseUtil.commaDelimitedStringToSet(cookiesValue);