因有客户的需求为,打开网站,自动使用当前电脑的域账号登录,不需要再次输入账号密码。通俗点来说就是单点登录,基本的实现就是通过jcifs。 原理为配置jcifs获取当前电脑登录的域账号,然后通过域账号去登录系统。
参考了一些资料,实现起来还是比较简单的。首先,项目引入要使用的jar包,即jcifs-1.3.17.jar(版本不固定尽量选高点)。然后配置web.xml文件,具体如下:
<filter>
<filter-name>NtlmHttpFilter</filter-name>
<filter-class>jcifs.http.NtlmHttpFilter</filter-class>
<init-param>
<param-name>jcifs.smb.client.soTimeout</param-name>
<param-value>5000</param-value>
</init-param>
<!--域服务器地址-->
<init-param>
<param-name>jcifs.http.domainController</param-name>
<param-value>192.16.10.10</param-value>
</init-param>
<!--域服务器域名-->
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>china</param-value>
</init-param>
<init-param>
<param-name>jcifs.util.loglevel</param-name>
<param-value>2</param-value>
</init-param>
<!--域服务器账号-->
<init-param>
<param-name>jcifs.smb.client.username</param-name>
<param-value>xxxxxx</param-value>
</init-param>
<!--域服务器密码-->
<init-param>
<param-name>jcifs.smb.client.password</param-name>
<param-value>xxxxxx</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.lmCompatibility</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.useExtendedSecurity</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>NtlmHttpFilter</filter-name>
<url-pattern>/Viewer</url-pattern>
</filter-mapping>
web.xml的配置也是比较容易配置,配置好之后,如果当前电脑在域中,则我们可以在代码中去获取用户,具体方法为httpRequest.getRemoteUser();。之后我们拿到登录的用户名,去进行我们应用系统的登录即可。
配置比较简单,但在用的过程中遇到了两个问题,我搜索后发现也是比较普遍的。
第一个 :jcifs.smb.SmbException: The parameter is incorrect. 域验证是按windows 的HTLM协议实现的,有的机器不能登录是因为机器默认的验证协议是HTLMv2的,跟ie个版本浏览器关系不大,所以需要改一下默认协议,修改注册表。
解决办法:
将下列虚线中间部分拷贝到txt文件中,并修改后缀名称为 .reg 的注册表文件,双击运行一次。
--------------------------------------------------
REGEDIT4
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa]
"LMCompatibilityLevel"=dword:00000001
--------------------------------------------------
该问题解决资料来源:http://blog.sina.com.cn/s/blog_6bf100660101ecr8.html
第二个:用户打开浏览器后没有自动登录,需要再次输入域账号和密码才能登录。这个是需要去设置下ie浏览器,设置Internet选项-安全-本地Intranet-高级-添加当前地址。然后点击自定义级别,滚动条拉到最后,选自动使用当前用户名密码登录。