首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Ajax >

怎么判断一个请求是否为AJAX请求

2012-11-13 
如何判断一个请求是否为AJAX请求在一次做非常复杂的ajax应用时,如果一个会话已经超时,但是此时再通过ajax

如何判断一个请求是否为AJAX请求
   在一次做非常复杂的ajax应用时,如果一个会话已经超时,但是此时再通过ajax请求,那么ajax返回的则是一个登陆页面的html,那这下就惨了,页面上而已就乱了,那么,能否在java端,如拦截器里判断客户的的请求是否是ajax请求呢,经过查询,能.
   普通请求与ajax请求的报文头不一样,通过如下

String requestType = request.getHeader("X-Requested-With");

如果requestType能拿到值,并且值为XMLHttpRequest,表示客户端的请求为异步请求,那自然是ajax请求了,反之如果为null,则是普通的请求

/**
* 日志系统抽象类
*
*/
abstract class LogWriterAbstract {

    /**
     * 是否启用日志记录
     *
     * @var boolean
     */
    protected $_enabled = true;
   
    /**
     * 日志记录的错误级别
     *
     * @var array
     */
    protected $_errorLevel = array(
    'notice' => false,
    'debug' => false,
    'warning' => false,
    'error' => false,
    'exception' => false,
    'info' => false,
    );
   
    abstract function append($msg, $title = '', $level = 'info');
}

/**
* LogFirePHPWriter 类提供对 FirePHP 的支持
*/
class LogFirePHPWriter extends LogWriterAbstract {
       
    function __construct(){
    $this->_enabled = App::ini('_log/enabled',true);
    if (!$this->_enabled) return;
   
    $errorLevel = normalize(strtolower(App::ini('_log/levels','exception,error')),',');
           
        if (!empty($errorLevel))
            foreach ($errorLevel as $e)
               $this->_errorLevel[$e] = true;
    }
   
    function append($msg, $title = '', $level = 'info'){
    $level = strtolower(trim($level));
    if ($this->_enabled && isset($this->_errorLevel[$level])){
    switch($level){
    case 'info':
    case 'debug':
    FirePhpHelper::getInstance()->info($msg, $title);
    break;
    case 'notice':
    FirePhpHelper::getInstance()->log($msg, $title);
    break;
    case 'exception':
    FirePhpHelper::getInstance()->warn($msg, $title);
    break;
    case 'error':
    FirePhpHelper::getInstance()->error($msg, $title);
    break;
    }
    }
    }
}

/**
* LogFile 类提供基本的文件日志服务
*/
class LogFileWriter extends LogWriterAbstract {

/**
     * 保存运行期间的日志
     *
     * @var string
     */
    private $_log = '';

    /**
     * 日期格式
     *
     * @var string
     */
    private $dateFormat = 'Y-m-d H:i:s';

    /**
     * 保存日志文件的目录
     *
     * @var string
     */
    private $_logFileDir;

    /**
     * 保存日志的文件名
     *
     * @var string
     */
    private $_logFilename;
   
    /**
     * 构造函数
     */
    function __construct()
    {
    $this->_enabled = App::ini('_log/enabled',true);
    if (!$this->_enabled) return;
   
        $dir = App::ini('_log/file_dir',null);
        if (empty($dir)){
        $this->_enabled = false;
        return;
        }
       
        $dir = realpath($dir);
        if (substr($dir, -1) != DS) {
            $dir .= DS;
        }
        if (!is_dir($dir) || !is_writable($dir)) {
            $this->_enabled = false;
        } else {
            $this->_logFileDir = $dir;
            $this->_logFilename = $this->_logFileDir . App::ini('_log/filename','access.log');
            $errorLevel = normalize(strtolower(App::ini('_log/levels','exception,error')),',');
           
            if (!empty($errorLevel)){
            foreach ($errorLevel as $e){
            if (isset($this->_errorLevel[$e]))
            $this->_errorLevel[$e] = true;
            }
            }
           
            global $___sfw_loaded_time;
            $sec = (int) $___sfw_loaded_time;
        $usec = $___sfw_loaded_time - $sec;
           
            $this->_startTag = sprintf("[%s %s] ======= SFW Loaded =======\n",
                date($this->dateFormat, $sec), $usec);

            if (isset($_SERVER['REQUEST_URI'])) {
                $this->_startTag .= sprintf("[%s] REQUEST_URI: %s\n",
                        date($this->dateFormat),
                        $_SERVER['REQUEST_URI']);
            }

            // 注册脚本结束时要运行的方法,将缓存的日志内容写入文件
            ShutdownCallback::getInstance()->add(array($this, '__writeLog'));
           
            // 检查文件是否已经超过指定大小
            if (file_exists($this->_logFilename)) {
                $filesize = filesize($this->_logFilename);
            } else {
                $filesize = 0;
            }
            $maxsize = (int)App::ini('_log/file_maxsize',512);
            if ($maxsize >= 512) {
                $maxsize = $maxsize * 1024;
                if ($filesize >= $maxsize) {
                    // 使用新的日志文件名
                    $pathinfo = pathinfo($this->_logFilename);
                    $newFilename = $pathinfo['dirname'] . DS .
                        basename($pathinfo['basename'], '.' . $pathinfo['extension']) .
                        date('-Ymd-His') . '.' . $pathinfo['extension'];
                    rename($this->_logFilename, $newFilename);
                }
            }
        }
    }

    /**
     * 追加日志信息
     *
     * @param string $msg
     * @param string $title
     * @param string $level
     */
    function append($msg, $title = '', $level = 'info')
    {
    if ($this->_enabled && isset($this->_errorLevel[strtolower($level)])){
        $this->_log .= sprintf("[%s] [%s] %s:%s\n", date($this->dateFormat), $level, $title, print_r($msg, true));
    }
    }

/**
     * 将缓存的日志信息写入实际存储,并清空缓存
     * 此方法由系统自动调用
     *
     */
    function __writeLog(){
   
if (!$this->_enabled) return;

if (empty($this->_log)) return;

global $___sfw_loaded_time;
       
$shutdown_time = microtime(true);
        $sec = (int) $shutdown_time;
        $usec = $shutdown_time - $sec;
       
        $elapsedTime = $shutdown_time - $___sfw_loaded_time;
       
        $content = $this->_startTag . $this->_log . sprintf("[%s %s] ======= SFW End (elapsed: %f seconds) =======\n\n",date($this->dateFormat, $sec), $usec, $elapsedTime);

        $fp = fopen($this->_logFilename, 'a');
        if (!$fp) { return; }
        flock($fp, LOCK_EX);
        fwrite($fp, str_replace("\r", '', $content));
        flock($fp, LOCK_UN);
        fclose($fp);
    }
}
</pre>
<p>?</p> 35 楼 defty 2011-06-09   其实不用判断啊,会话既然已经过期,就直接返回登录页面,你管它是从哪里来的 36 楼 chansman 2011-06-20   写2个方法 37 楼 抛出异常的爱 2011-06-20   kimmking 写道报文头可以自己设置的。
严格的说,木有办法。
从收的地方想办法
你发送返回的如果是html
总有预期吧

目有达到预期的html
都是错的不加到到dom树上 38 楼 grandboy 2011-06-21   使用URL来区分是最理想的设计方案。另外判断是不是已经SESSION过期可以在返回页面之前用切面(+少量js)处理,返回页面那就是登录页面了, 当然如果权限模型比较复杂的话,可能只能区别不同类型的请求的思路来处理了。

热点排行