如何判断一个请求是否为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)处理,返回页面那就是登录页面了, 当然如果权限模型比较复杂的话,可能只能区别不同类型的请求的思路来处理了。