EWA

权限和日志

2016-05-24

一、涉及对象

  1. RequestValue(com.gdxsoft.easyweb.script.RequestValue)

RequestValue是系统中获取参数使用的对象,它将From,Cookie,Session,Query,数据集(DTTable)等对象传递的参数作为一个对象统一处理。从而简便编程环境。 RequestValue基本使用是getString(参数名),例如getString(‘xmlname’)是获取配置文件名称。getRequest()是获取页面的request对象。

  1. DataConnection(com.gdxsoft.easyweb.datasource.DataConnection)

DataConnection是数据库连接,用于系统和数据库的操作,调用WEB容器的数据库连接池。使用方法: 生成对象

DataConnection conn=new DataConnection();
//在EwaConnection.xml中定义的名称获取结果集
conn.setConfigName(‘test’); 
//设置参数集合对象
conn.setRequestValue(requestValue);
//执行带参数查询命令
conn.executeQuery(‘select * from users where uid=@uid’);
ResultSet rs=null; //结果集
if(conn.getErrorMsg()==null || conn.getErrorMsg().length==0){
        rs=conn.getLastResult().getResultSet(); //获取结果集
        ….
}
conn.close(); //关闭连接
  1. Log(com.gdxsoft.easyweb.log.Log)

Log是记录日志的信息类,包括执行的配置文件(xmlname),配置项(itemname),调用的活动(Action),日期,IP,执行时间,日志描述信息等,在编写自定义类中调用。

二、权限说明

页面权限可根据需要自行编写权限控制类,控制类需要根据IAcl接口派生(com.gdxsoft.easyweb.acl.IAcl)。

  1. 接口说明:
函数 说明 参数 返回值 备注
canRun 是否可继续执行 true/false 如果true则继续执行,否则跳转到指定的页面
getGotoUrl 获取跳转页面 String canRun为false时调用
setGotoUrl 赋值跳转页面 好像用处不大。
getRequestValue 获取参数值对象 RequestValue 用于内部调用判断用
  1. 编程说明

用户在编写自定义Acl时,主要编写canRun方法。基本思路是根据传递的参数来判别该模块是否当前用户可执行。如果不可执行,设置getGotoUrl获取的地址供系统调用。

使用方式是在配置项的Page参数表中设置Acl参数,填写你自定义的类的全称,例如:“your.pakagename.MyAcl”,系统会自动调用并执行。

举例说明,要点是注意两点,首先是判断是否允许执行,可从数据库,session或其他资源获取相应数据,其次根据参数设定不同的跳转地址。

package your.pakagename;
import com.gdxsoft.easyweb.script.RequestValue;
import com.gdxsoft.easyweb.acl.IAcl;
import com.gdxsoft.easyweb.datasource.DataConnection;
import com.gdxsoft.easyweb.datasource.Data.DTTable;
 
public class MyAcl implements IAcl {
    private String _XmlName;
    private String _ItemName;
    private RequestValue _RequestValue;
    private String _GoToUrl; //验证失败跳转页面
       
    public boolean canRun() {
        //在session中保存了管理员编号 ADM_ID
        //在表USER_ACL保存了权限数据,字段ALLOW表示是否可执行
        String sql = ”SELECT ALLOW FROM USER_ACL WHERE ”
            + ” USER_ID=@ADM_ID AND ITEM_NAME=@ITEMNAME ”
            + ” AND XML_NAME=@XMLNAME”;
           
        DataConnection conn=new DataConnection();
        cnn.setConfigName(‘test’);
        //设置参数集合对象
        conn.setRequestValue(this._RequestValue);
        //执行带参数查询命令
        conn.executeQuery(sql);
        ResultSet rs=null; //结果集
        boolean isCanRun=false; //返回值
        if(conn.getErrorMsg()==null || conn.getErrorMsg().length==0){
            rs = conn.getLastResult().getResultSet(); //获取结果集
            //使用DTTable获取rs数据集
            DTTable table = new DTTable();
            table.initData(table);
            if(table.isOk() && table.getCount()>0){
                //获取指定字段的值
                Object o = table.getRow(0).getCell(“ALLOW”).getValue();
                if(o!=null && o.toString().equals(“YES”)){
                    isCanRun=true;
                }
            }
        }
        conn.close(); //关闭连接
        if(!isCanRun){
            //指向相应地址
            String xn=this._RequestValue.getString(‘XMLNAME’).toLower();
            //根据XmlName判断,设置跳转地址
            if(xn.indexOf(“|admin.xml”)>){
                this._GoToUrl=”/messages/errors/deny.html”;
            }else{
                this._GoToUrl=”/messages/errors/user_deny.html”;
            }
        }
        return isCanRun;
    }
 
    //赋值参数对象,类里要有对象接收
    public void setRequestValue(RequestValue requestValue) {
        this._RequestValue = requestValue;
    }
    //获取跳转地址,注意要赋值 _GoToUrl
    public String getGoToUrl() {
        return _GoToUrl;
    }
   
    public RequestValue getRequestValue() {
        return _RequestValue;
    }
    public MyAcl() {
    }
    public MyAcl(String xmlName, String itemName) {
        this._ItemName = itemName;
        this._XmlName = xmlName;
    }
    public String getXmlName() {
        return _XmlName;
    }
    public void setXmlName(String xmlName) {
        _XmlName = xmlName;
    }
    public String getItemName() {
        return _ItemName;
    }
    public void setItemName(String itemName) {
        _ItemName = itemName;
    }
   
    public void setGoToUrl(String goToUrl) {
        _GoToUrl = goToUrl;
    }
}

三、日志说明

日志可根据需要自行编写日志记录类,控制类需要根据ILog接口派生(com.gdxsoft.easyweb.log.ILog)。

  1. 接口说明:
函数 说明 参数 返回值 备注
write 写日志 主要编写部分
setLog 赋值日志 log 日志信息
getLog 获取日志 String
  1. 编程说明

用户在编写自定义Log时,主要编写write方法,作用是记录日志信息,无论是填写到数据库还是到文件用户需要自行编写。

使用方式是在配置项的Page参数表中设置Log参数,填写你自定义的类的全称,例如:“your.pakagename.MyLog”,同时,要在Action参数表中的CallSet部分填写记录日志的信息,例如“用户@username调用@xmlname的@ItemName”,系统会自动调用并执行。

举例说明。

package your.pakagename;
import com.gdxsoft.easyweb.datasource.DataConnection;
import com.gdxsoft.easyweb.script.RequestValue;
 
public class MyLog  implements ILog {
private Log _Log;
    public void Write() {
        if (super.getLog().getMsg() == null) {
            return;
        }
/*
System.out.println(super.getLog().getXmlName() + ", "
                + super.getLog().getItemName() + ", " + super.getLog().getMsg()
                + ", " + super.getLog().getRunTime() + ", "
                + super.getLog().getDate());
*/
        this.WriteToLog();
    }
 
    /**
     * 参考定义自己的写入日志的方法, 下面的例子是个参考,是用于写入数据库的日志
     *
     * CREATE TABLE LOG_MAIN( LOG_ID INT IDENTITY, USER_ID INT, LOG_MSG
     * NVARCHAR(1000), LOG_TIME DATETIME, LOG_IP VARCHAR(19), LOG_XMLNAME
     * VARCHAR(200), LOG_ITEMNAME VARCHAR(244), LOG_RUNTIME INT, LOG_ACTION
     * VARCHAR(233), LOG_URL varchar(1500), LOG_REFERER varchar(1500), LOG_DES
     * nvarchar(200) )
     */
    private void WriteToLog() {
        // 根据自己的日志表结构生成写入日志的方法
        Log log = super.getLog();
        String sql = "INSERT INTO LOG_MAIN(LOG_DES, LOG_MSG, LOG_TIME,"
                + " LOG_IP, LOG_XMLNAME, LOG_ITEMNAME, LOG_RUNTIME"
                + ", LOG_ACTION, LOG_URL, LOG_REFERER)"
                + " VALUES (@LOG_DES, @LOG_MSG, @LOG_TIME,"
                + " @LOG_IP, @LOG_XMLNAME, @LOG_ITEMNAME, @LOG_RUNTIME, "
                + "@LOG_ACTION,  @LOG_URL, @LOG_REFERER)";
        RequestValue rv = new RequestValue();
        rv.addValue("LOG_DES", log.getDescription());
        rv.addValue("LOG_MSG", log.getMsg());
        rv.addValue("LOG_TIME", log.getDate(), "Date", 100);
        rv.addValue("LOG_IP", log.getIp());
        rv.addValue("LOG_XMLNAME", log.getXmlName());
        rv.addValue("LOG_ITEMNAME", log.getItemName());
        rv.addValue("LOG_RUNTIME", log.getRunTime());
        rv.addValue("LOG_ACTION", log.getActionName());
        rv.addValue("LOG_URL", log.getUrl());
        rv.addValue("LOG_REFERER", log.getRefererUrl());
 
        DataConnection cnn = new DataConnection();
        cnn.setConfigName(‘test’);
        try {
            // 设在日志的 RequestValue
            cnn.setRequestValue(rv);
            cnn.executeUpdate(sql);
        } catch (Exception e) {
            System.err.println(e);
        } finally {
            cnn.close();
        }
    }
    public Log getLog() {
        return _Log;
    }
    public void setLog(Log log) {
        _Log = log;
    }
}