2014年4月 的存档

mybatis查询传递Integer类型参数报错

使用mybatis查询数据库,在传递Integer类型参数时,遇到下面的错误:

Servlet.service() for servlet [spring] in context with path /] threw exception [Request processing failed;
nested exception is org.mybatis.spring.MyBatisSystemException:
nested exception is org.apache.ibatis.reflection.ReflectionException:
There is no getter for property named ‘abc’ in ‘class java.lang.Integer’]

解决方法有两种:

一是将参数名称 “abc” 替换为”_parameter”。

二是在接口中定义方法时添加标注@Param(“abc”)

linux执行shell脚本,提示“没有那个文件或目录”

linux执行shell脚本,提示“没有那个文件或目录”

终端直接cd /var正常
shell脚本中执行则报错

原因是脚本是在windows平台下写的,换行符与linux不同,造成脚本不能正确执行。

windows是CR+LF
Unix/linux是LF
Mac是CR

通过html5方法无刷新变更页面url地址

通过html5方法无刷新变更页面url地址,基于安全的要求,url是不可以跨域的

pushState()方法接受三个参数

状态对象(state object) — 一个JavaScript对象,与用pushState()方法创建的新历史记录条目关联。无论何时用户导航到新创建的状态,popstate事件都会被触发,并且事件对象的state属性都包含历史记录条目的状态对象的拷贝。

任何可序列化的对象都可以被当做状态对象。因为FireFox浏览器会把状态对象保存到用户的硬盘,这样它们就能在用户重启浏览器之后被还原,我们强行限制状态对象的大小为640k。如果你向pushState()方法传递了一个超过该限额的状态对象,该方法会抛出异常。如果你需要存储很大的数据,建议使用sessionStorage或localStorage。

标题(title) — FireFox浏览器目前会忽略该参数,虽然以后可能会用上。考虑到未来可能会对该方法进行修改,传一个空字符串会比较安全。或者,你也可以传入一个简短的标题,标明将要进入的状态。

地址(URL) — 新的历史记录条目的地址。浏览器不会在调用pushState()方法后加载该地址,但之后,可能会试图加载,例如用户重启浏览器。新的URL不一定是绝对路径;如果是相对路径,它将以当前URL为基准;传入的URL与当前URL应该是同源的,否则,pushState()会抛出异常。该参数是可选的;不指定的话则为文档当前URL。

浏览器兼容性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
replaceState, pushState 5 4.0 (2.0) 10 11.50 5.0
history.state 18 4.0 (2.0) 10 11.50 6.0

关于history对象的详细说明可以参考mozilla的文档
https://developer.mozilla.org/zh-CN/docs/DOM/Manipulating_the_browser_history

下面是个简单的小例子:

jquery判断checkbox是否选中

所使用的jquery版本为jquery-1.9.1,浏览器为Chrome

1.通过prop方法获取checked属性,获取的checked返回值为boolean,选中为true,否则为flase

2.如果使用attr方法获取时,如果当前input中初始化未定义checked属性,则不管当前是否选中,$(“#selectAll”).attr(“checked”)都会返回undefined;
如果当前input中初始化已定义checked属性,则不管是否选中,$(“#selectAll”).attr(“checked”)都会返回checked.

总结,如果使用jquery,应使用prop方法来获取和设置checked属性,不应使用attr.

window.onbeforeunload的正确用法

通过window.onbeforeunload方法,我们可以在用户离开当前页面时进行提示,通常情况是用户输入了某些内容而没有及时保存。

经常地,我们会被告知,onbeforeunload方法并不是所有的浏览器都支持的,的确是的。但是这并不影响我们对它的使用,因为主流的浏览器,或者说90%的浏览器都是支持的。

下面是引用mozilla社区关于onbeforeunload的浏览器支持情况

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 1 1 4 12 3

个人测试下来,如果使用的是基于Presto内核的opera,即使最新版12.15仍然是不支持的,需要使用基于WebKit内核的opera next才可以支持。对于safari已经停止windows平台版本的开发,历史的东西就让它属于历史吧

更多关于onbeforeunload的描述可以看看mozilla的开发文档
https://developer.mozilla.org/en-US/docs/Web/API/window.onbeforeunload

微软也有相关的介绍
http://msdn.microsoft.com/en-us/library/ms536907(v=vs.85).aspx

接着要特别指出的是,正确使用onbeforeunload才能达到理想的效果

window.onbeforeunload = function(e) {
return ‘Dialog text here.’;
};

我们经常会看到如下的写法

window.onbeforeunload = function(e) {
window.event.returnValue = “确定离开当前页面吗?”;
};

这样的写法是有局限性的,IE、chrome是有效的,而在firefox、opera next下是无效的。

配置cas实现单点登录实例

结合cas官方文档及一篇中文教程,搭建单点登录的完整实例。

官方配置文档,配置的每一步描述都很详细,不过各软件版本较旧,文档中给出的有些链接已经失效。
https://wiki.jasig.org/display/CASUM/Demo

small_love的中文教程很精炼
http://blog.csdn.net/small_love/article/details/6664831

系统环境 – windows 7 32

下面是详细的配置过程:

由于某些网络原因,cas官方网站(www.jasig.org/cas)无法访问,故将文中涉及到的各软件版本及下载地址列出

Tomcat 6.0.37
http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.37/bin/

cas-server 3.5.2
http://downloads.jasig.org/cas/

cas-client 3.2.1
http://downloads.jasig.org/cas-clients/

以上给出的仅为软件所在的目录,请根据自身需要下载相应的文件类型

1. JDK环境配置
不再赘述,请参考相关教程
cas-server-3.5需要jdk1.6以上的版本,本例jdk1.6.0_21

2. 使用JDK自带的keytool工具制作证书
如果将JAVA_HOME加入了系统path变量,在任意目录dos命令窗口都可以直接执行命令;否则需要在cmd中切换到java工具目录(例如C:\Program Files\Java\jdk1.6.0_21\bin)

// 生成证书并存储到自定义的证书库,输入的密码为证书库密码

keytool -genkey -alias tomcat -keyalg RSA -keystore C:/keystore
输入keystore密码:123456
再次输入新密码:123456
您的名字与姓氏是什么?
[Unknown]:compA
您的组织单位名称是什么?
[Unknown]:IT
您的组织名称是什么?
[Unknown]:Inc
您所在的城市或区域名称是什么?
[Unknown]:SZ
您所在的州或省份名称是什么?
[Unknown]:JS
该单位的两字母国家代码是什么
[Unknown]:CN
CN=compA, OU=IT, O=Inc, L=SZ, ST=JS, C=CN 正确吗?
[否]:是
输入的主密码
(如果和 keystore 密码相同,按回车):回车

// 从自定义证书库中导出证书文件,密码为自定义证书库的密码

keytool -export -file C:/server.crt -alias tomcat -keystore C:/keystore
输入keystore密码:123456
保存在文件中的认证

// 将证书导入JDK证书库中,此处要求输入的密码是JDK的证书库密码,默认为changeit

keytool -import -keystore “%JAVA_HOME%\jre\lib\security\cacerts” -file C:/server.crt -alias tomcat
输入keystore密码:changeit
所有者:CN=compA, OU=IT, O=Inc, L=SZ, ST=JS, C=CN
签发人:CN=compA, OU=IT, O=Inc, L=SZ, ST=JS, C=CN
序列号:52564247
有效期: Thu Oct 10 13:59:35 CST 2013 至Wed Jan 08 13:59:35 CST 2014
证书指纹:
MD5:4D:9A:FE:3E:CB:72:CF:FC:00:FF:74:96:0C:24:22:2D
SHA1:9E:61:59:FF:27:A2:3B:EA:58:06:31:F9:5B:BA:C4:FA:D8:1D:62:6B
签名算法名称:SHA1withRSA
版本: 3
信任这个认证? [否]: 是
认证已添加至keystore中

如果出现错误,可能是JDK的证书库密码已经修改过了,如果不知道密码,需要删除%JAVA_HOME%\jre\lib\security\cacerts文件,再重新导入证书,此时会自动新建一个证书库,会要求设置证书库的密码
keytool错误: java.io.IOException: Keystore was tampered with, or password was incorrect

修改证书库密码可以使用下面的命令

C:\Users\flyash>keytool -storepasswd -keystore “%JAVA_HOME%\jre\lib\security\cacerts”

3. 配置cas服务器
安装Tomcat 6.0.37,此处不再展开,请参考tomcat安装的相关说明教程。

解压下载的cas-server-3.5.2,将modules文件夹下的cas-server-webapp-3.5.2.war复制到tomcat的webapps目录下并重命名为cas.war

修改tomcat的conf目录下的server.xml文件,去掉SSL在8443端口配置的注释,修改后的配置如下

启动tomcat,访问https://localhost:8443/cas/可以看到cas的登录页面,浏览器会提示证书不受信任,忽略或者添加例外即可。

4. 配置cas客户端
本例中cas客户端和服务端使用同一个tomcat,仅用于演示,实际使用中,一般客户端与服务端分属于不同的tomcat(服务器)中。

解压下载的cas-client-3.2.1,将modules文件夹下的cas-client-core-3.2.1.jar和commons-logging-1.1.jar复制到tomcat下的webapps\examples\WEB-INF\lib目录。

修改tomcat的webapps\examples\WEB-INF下的web.xml文件,增加cas过滤器,这里cas服务器的地址不能是localhost,此处通过修改host文件自定义域名指向本机

修改host文件,增加一行,注意域名(主机名)小写

127.0.0.1 compa

重启tomcat,访问http://localhost:8080/examples/servlets/servlet/HelloWorldExample,会跳转到cas登录页面

输入用户名及密码admin,登录成功后返回到hello world页面