WEBWORK:我寫的webwork2中的cookie攔截器

我寫的webwork2中的cookie攔截器

作者:jscud

轉載文章,轉載自:
http://www.jscud.com/srun/news/viewhtml/4_2005_1/17.htm


webwork中沒有cookie的映射,只有session的映射. 參考了moxie的cookie攔截器,自己寫了一個攔截器.  :P
 
攔截器代碼如下:
 
package com.cnscud.util.interceptor;
 
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.cnscud.util.WebCookies;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.AroundInterceptor;
import com.opensymphony.xwork.util.OgnlValueStack;
/**
 * Cookie攔截器,在Action裏增加getWebCookies
 *
 * 參考moxie的cookie測試攔截器.
 *
 * @author scud 2004.10
 *
 */
public class WebCookiesInterceptor extends AroundInterceptor
{
    protected void after(ActionInvocation arg0, String arg1) throws Exception
    {
    }
    protected void before(ActionInvocation arg0) throws Exception
    {
        HttpServletResponse response = ServletActionContext.getResponse();
        HttpServletRequest request = ServletActionContext.getRequest();
       
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0)
        {
            final OgnlValueStack stack = ServletActionContext.getContext().getValueStack();
           
            WebCookies aWCs = new WebCookies(request,response,cookies);           
            stack.setValue(WebCookies.KEY_WEBCOOKIES,aWCs);
        }
    }
}

 
 
 
WebCookies的代碼如下:
 
package com.cnscud.util;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.*;
/*
 * WebCookies類
 *
 * 寫一個cookie類來代替Cookie就不用依賴javax.servlet.http了 (TODO)
 *
 * @author scud 2004.10
 * 
 */
public class WebCookies
{
    /** ValueStack裏面的鍵值 */
    public static final String KEY_WEBCOOKIES = "webCookies";
    private HttpServletRequest request;
    private HttpServletResponse response;
    private Cookie[] cookies;
    private Map cookieMap = new HashMap(20);
    /**
     * 構造函數
     *
     * @param request
     * @param response
     * @param cookies
     */
    public WebCookies(HttpServletRequest request, HttpServletResponse response,
            Cookie[] cookies)
    {
        this.request = request;
        this.response = response;
        setCookies(cookies);
    }
    /**
     * 設置Cookie數組
     *
     * @param cookies
     */
    public void setCookies(Cookie[] cookies)
    {
        cookieMap.clear();
        this.cookies = cookies;
        for (int i = 0; i < cookies.length; i++)
        {
            Cookie acookie = cookies[i];
            cookieMap.put(acookie.getName(), acookie);
        }
    }
    /**
     * 得到cookie數組
     *
     * @return cookie的數組
     */
    public Cookie[] getCookies()
    {
        return cookies;
    }
    /**
     * 得到某個cookie
     *
     * @param sKey 鍵名
     * @return 對應的cookie
     */
    public Cookie getCookie(String sKey)
    {
        if (null == cookieMap)
        {
            return null;
        }
        Object ac = cookieMap.get(sKey);
        if (null != ac)
        {
            return (Cookie) ac;
        }
        return null;
    }
    public Cookie get(String sKey)
    {
        return getCookie(sKey);
    }
   
    public Map getCookieMap()
    {
        return cookieMap;
    }
    /**
     * 添加一個cookie設置到HttpServletResponse中去
     *
     * @param aCookie
     */
    public void addCookie(Cookie aCookie)
    {
        //調用response的addCookie
        if (null != response)
        {
            response.addCookie(aCookie);
        }
    }
}
 
基礎Action的代碼如下: (其他action繼承此Action即可)
 
package test;
import com.cnscud.util.WebCookies;
import com.opensymphony.xwork.ActionSupport;

public class CookieAction extends ActionSupport
{
    protected WebCookies webcookies;
    public void setWebCookies(WebCookies webcookies)
    {
        this.webcookies = webcookies;
    }
   
   
    public WebCookies getWebCookies()
    {
        return webcookies;
    }
   
}
 
Xwork的配置如下,可以根據自己的需求改動,我是所有action都截取cookie
 
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
 <include file="webwork-default.xml"/>
 
 <package name="helloWorld" extends="webwork-default">

     <interceptors>
      <interceptor name="webCookiesInterceptor" class="com.cnscud.util.interceptor.WebCookiesInterceptor" />
            <interceptor-stack name="cookieStatck">
                <interceptor-ref name="webCookiesInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
     </interceptors>
  <default-interceptor-ref name="cookieStatck" />
     <action name="startCookie" class="test.StartAction">
      <result name="success" type="dispatcher">
    <param name="location">/start.jsp</param>
   </result>
     </action>
     
     <action name="resultCookie" class="test.ResultAction">
      <result name="success" type="dispatcher">
    <param name="location">/result.jsp</param>
   </result>
     </action>
 </package>
 
   
   
</xwork>
 
result的頁面:
 
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="webwork" prefix="ww" %>
<html>
  <head>   
    <title>My JSP 'result.jsp' result page</title>   
  </head>
 
  <body>
  cookie Hello:
  <ww:property   value="webCookies.cookieMap['Hello'].value" />
  <br><br>
   Cookie Hello2:
  <ww:property   value="webCookies.cookieMap.Hello2.value" />
  <br><br>
  testValue:<ww:property   value="testValue" />
  <br><br>
  </body>
</html>

ResultAction代碼如下:
 
package test;

import javax.servlet.http.Cookie;

public class ResultAction extends CookieAction
{
   
    private String testValue;
   
    public String execute() throws Exception
    {
        //for test
        Cookie[] cs = webcookies.getCookies();     
       
       
       
        return SUCCESS;
    }
   
    public void setTestValue(String testValue)
    {
        this.testValue = testValue;
    }
   
    public String getTestValue()
    {
        return testValue;
    }
   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章