0%

我在利用uploadify插件上传文件时发现java后台获取不到当前用户的session值,即当前的用户的session保存的信息失效,导致拦截器将上传请求拦截,这里的拦截器主要对登录的信息进行拦截验证,正因为此原因,导致上传文件失败,后来在利用firebug查找请求的时候,发现uploadify插件会自动生成一个新的session,导致原来的session失效,解决方法是将jsessionid通过url传到后台,这样后台就能识别当前session,问题也就解决了。代码如下:

1
2
3
4
5
$("#uploadify").uploadify({
debug : false,
swf : CTPPATH+'/admin/static/uploadify/js/uploadify.swf', //swf文件路径
method : 'get', // 提交方式
uploader : CTPPATH+'/processUpload.ado;jsessionid=${pageContext.session.id}', // 服务器端处理该上传请求的程序(servlet, struts2-Action) )};

代码中有许多属性这里没有贴出来,这里主要看uploader属性,uploader属性为CTPPATH+’/processUpload.ado;jsessionid=${pageContext.session.id}’,即在请求url中附上
;jsessionid=${pageContext.session.id},这样上传就没问题了。

网站的消息推送功能应用很广泛,比如论坛,问答网站等等都需要推送消息,那么采用什么样的推送方式更加便捷,更加节省服务器资源呢,这个需要根据网站的流量和规模来决定,因为long polling是我最先接触到的,我就来谈谈它吧。

长轮询初看像是轮流查询的意思,其实不是,它是客户端通过ajax发出请求,然后客户端挂起,等待服务器端响应,服务器端会检测有无新消息,如果有消息,服务器端会将新消息推送给客户端,结束本次请求,如果在有效请求期内没有新消息出现,那么会一直检测有无新消息出现。连接会保持一段时间周期直到数据或状态改变或者时间过期,通过这种机制来减少无效的客户端和服务器间的交互。

虽然长轮循比传统的轮询性能会有些提高,但在服务器端数据变化非常频繁的情况下,两者的性能并不能差多少,因为都是客户端先请求,服务器再响应,只是两者服务器端响应的机制不同。
下面来说说代码,服务器端我用的是php,客户端用的是jQuery

服务器端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* @desc ajax长轮询 来获取通知消息信息
* @return 通知信息数量>o
*/
public function longPolling() {
if(!$_GET['timed']) exit();
date_default_timezone_set("PRC");
session_write_close(); //防止session访问互斥问题
set_time_limit(0);//无限请求超时时间
$timed = $_GET['timed'];
while (true) {
sleep(3); // 休眠3秒
//判断有无新通知出现
$no_count=D('Notifications')->getNotificationsCount($this->uid);
if ($no_count>0) {
$responseTime = time();
// 返回数据信息,请求时间、返回数据时间、耗时
$content=array(
'result' =>$no_count,
'reponse_time' =>$responseTime,
'request_time' =>$timed,
'use_time' =>($responseTime - $timed)
);
echo $this->ajaxReturn($content);
exit();
} else { // 模拟没有数据变化,将休眠 hold住连接
sleep(13);
exit();
}
}
}
Read more »

在php中有一个函数可以将数组转化为json数据存储格式,这个函数就是json_encode
但在使用这个函数时转化的格式不一致,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//关联二位数组
$a2=array(
'1'=>array('name'=>'john','age'=>'32'),
'2'=>array('name'=>'tom','age'=>'22')
);
$json2=json_encode($a2);
echo $json2."<br>"; //{"1":{"name":"john","age":"32"},"2":{"name":"tom","age":"22"}}
//索引二维数组
$a3=array(
array('name'=>'zz','age'=>'31'),
array('name'=>'we','AGE'=>'12')
);
$json3=json_encode($a3);
echo $json3."<br>";//[{"name":"zz","age":"31"},{"name":"we","AGE":"12"}]

关联二维数组和索引二维数组转化为json数据格式不同,这时在前台用js解析json的时候就有差别

  • 对于关联数组生成的json数据格式 ,在前台直接用js的eval()将其转化为json对象,然后根据{key:value}取值
  • 对于索引数组生成的json数据格式,用js的eval()转为json对象后,由于[]代表数组格式,所以遇到[]还是按照数组取值,遇到{key:value}这种形式的按照对象取值就行了

当数组维数多的时候需要根据转换后的json数据格式用js进行相应的解析,避免出错。

最近做的网站的一个下载功能出现了问题,在firefox浏览器以及360浏览器下下载均正常,也能将中文正常转换,但在IE浏览器下却出现了问题,当点击下载链接的时候,后台直接报错:
2017-03-17_113722.png
后台我怎么兼容也不能解决问题,我下载的部分java代码:

QQ图片20170317113901.png

进过我仔细查找,发现我前台通过get方式提交的文件名包含一下字符,导致浏览器解析url不一致,所以需要将url通过javascript进行转码,即用encodeURIComponent函数进行编码,代码如下

1
<a href="javascript:location.href='${pageContext.request.contextPath}/download.do?realname='+encodeURIComponent('${file_list.real_name}')+'&filename='+encodeURIComponent('${file_list.file_name}');" class="file-name">${file_list.file_name}</a>

通过将文件名编码之后就能解决问题了

最近用javaee写网站配置数据源时遇到了这个错误:

java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to com.mysql.jdbc.Connection

经过我查看代码发现有些类中包导错了,涉及到数据库的包应该导入java.sql.*这个相关的,而我用ide自动导入为jdbc那个了,发生了类型不匹配问题,改掉就不会报这个错了。

试试一下markdowm

这是一个标题

  1. 这是第一行列表项
  2. 这是第二行列表项

列表

Markdown 支持有序列表和无序列表。

无序列表使用星号、加号或是减号作为列表标记:

*   Red
*   Green
*   Blue
等同于:
+   Red
+   Green
+   Blue
也等同于:
-   Red
-   Green
-   Blue
有序列表则使用数字接着一个英文句点:
1.  Bird
2.  McHale
3.  Parish

代码区块

markdown使用

 来将代码包裹起来

分割线





链接

1
System.out.println("helllo world");
1
[This link](http://example.net/) has no title attribute.

This link has no title attribute.

强调

Markdown 使用星号()和底线(_)作为标记强调字词的符号,被 包围的字词会被转成用 标签包围,用两个 * 或 包起来的话,则会被转成 ,例如:

1
2
3
4
5
6
7
*single asterisks*

_single underscores_

**double asterisks**

__double underscores__

会转成:

1
2
3
4
5
6
7
<em>single asterisks</em>

<em>single underscores</em>

<strong>double asterisks</strong>

<strong>double underscores</strong>

我在配置要数据源后没有仔细检查我的代码,有些数据库连接没有及时关闭,报以下异常:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle objec

这个异常产生的原因是在使用完数据库连接后没有及时关闭,导致数据库连接池的连接没有可供使用的连接,进而报异常。
解决的方法是检查代码,将数据库连接及时关闭,并且在context.xml文件中加上

removeAbandoned=”true” removeAbandonedTimeout=”60”
logAbandoned=”true”

这样就解决问题了。

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment