先简述一下系统使用的技术,框架是struts1.2,action继承LookupDispatchAction,页面的验证使用validation,应用服务器为jboss4.2
问题描述:
在web.xml配置文件中配置了实现域登录的Servlet后出现如下问题:
点击系统的“增加”按钮弹出的页面中的“保存”按钮无法调用action中对应的方法;
“修改”按钮弹出页面的“保存”则出现如下错误
WARN [RequestProcessor] Unhandled Exception thrown: classjavax.servlet.ServletException
INFO [[/]] Request[/doc/docmanagedetailaction] does not contain handlerparameter named 'act'. This may be caused by whitespace in the label text.
jsp页面中的“保存”按钮代码
<html:submit styleClass="button" property="act"onclick="return chkpagecount();">
<bean:message key="button.save" />
</html:submit>
实现域登录的Java文件(http://www.jcifs.com/可以下载相应的jar包)
/**
* 本java文件来自于jcifs.http.NtlmHttpFilter.java
*/
@SuppressWarnings({"serial","unused"})
public class ADServlet extends HttpServlet {
private static LogStream log = LogStream.getInstance();
private String defaultDomain;
private String domainController;
private boolean loadBalance;
private boolean enableBasic;
private boolean insecureBasic;
private String realm;
private Map map;
/**
* Initialize this servlet.
*
* @exception ServletException
* if we cannot configure ourselves correctly
*/
public void init(ServletConfig config) throws ServletException {
map=new HashMap();
Config.setProperty("jcifs.smb.client.soTimeout","1800000");
Config.setProperty("jcifs.netbios.cachePolicy","1200");
Config.setProperty("jcifs.smb.lmCompatibility","0");
Config.setProperty("jcifs.smb.client.useExtendedSecurity","false");
Enumeration e = config.getInitParameterNames();
do {
if (!e.hasMoreElements()) {
break;
}
String name = (String) e.nextElement();
if (name.startsWith("jcifs.")) {
Config.setProperty(name, config.getInitParameter(name));
}
} while (true);
defaultDomain = Config.getProperty("jcifs.smb.client.domain");
domainController =Config.getProperty("jcifs.http.domainController");
if (domainController == null) {
domainController = defaultDomain;
loadBalance = Config.getBoolean("jcifs.http.loadBalance",true);
}
enableBasic =Boolean.valueOf(Config.getProperty("jcifs.http.enableBasic")).booleanValue();
insecureBasic =Boolean.valueOf(Config.getProperty("jcifs.http.insecureBasic")).booleanValue();
realm = Config.getProperty("jcifs.http.basicRealm");
if (realm == null) {
realm = "jCIFS";
}
int level;
if ((level = Config.getInt("jcifs.util.loglevel", -1)) != -1){
LogStream.setLevel(level);
}
LogStream _tmp = log;
if (LogStream.level > 2) {
try {
Config.store(log, "JCIFS PROPERTIES");
} catch (IOException ioe) {
}
}
}
public void doGet(HttpServletRequest request, HttpServletResponseresponse)
throws IOException, ServletException {
NtlmPasswordAuthentication ntlm;
try{
if ((ntlm = negotiate(request, response, false)) == null) {
return;
} else {
String uuname=(String)map.get("adremoteuser");
System.out.println("\t\t域登陆用户名:"+uuname);
uuname=uuname.substring(uuname.indexOf("\\")+1,uuname.length());response.sendRedirect(request.getContextPath()+"/loginaction.do?act=login&companycode=test&username="+uuname+"&password=***");
return;
}
}catch (Exception e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponseresponse)
throws IOException, ServletException {
doGet(request, response);
}
public void destroy() {
map=null;
}
protected NtlmPasswordAuthentication negotiate(HttpServletRequest req,HttpServletResponse resp,
boolean skipAuthentication) throws IOException, ServletException {
NtlmPasswordAuthentication ntlm = null;
String msg = req.getHeader("Authorization");
boolean offerBasic = enableBasic && (insecureBasic ||req.isSecure());
if (msg != null && (msg.startsWith("NTLM ") ||offerBasic && msg.startsWith("Basic "))) {
UniAddress dc;
if (msg.startsWith("NTLM ")) {
HttpSession ssn = req.getSession();
byte challenge[];
if (loadBalance) {
NtlmChallenge chal = (NtlmChallenge) ssn.getAttribute("NtlmHttpChal");
if (chal == null) {
chal = SmbSession.getChallengeForDomain();
ssn.setAttribute("NtlmHttpChal", chal);
}
dc = chal.dc;
challenge = chal.challenge;
} else {
dc = UniAddress.getByName(domainController, true);
challenge = SmbSession.getChallenge(dc);
}
if ((ntlm = NtlmSsp.authenticate(req, resp, challenge)) == null) {
return null;
}
ssn.removeAttribute("NtlmHttpChal");
} else {
String auth = new String(Base64.decode(msg.substring(6)),"US-ASCII");
int index = auth.indexOf(':');
String user = index == -1 ? auth : auth.substring(0, index);
String password = index == -1 ? "" : auth.substring(index +1);
index = user.indexOf('\\');
if (index == -1) {
index = user.indexOf('/');
}
String domain = index == -1 ? defaultDomain : user.substring(0,index);
user = index == -1 ? user : user.substring(index + 1);
ntlm = new NtlmPasswordAuthentication(domain, user, password);
dc = UniAddress.getByName(domainController, true);
}
map.put("adremoteuser", ntlm.getName());
try {
SmbSession.logon(dc, ntlm);
LogStream _tmp = log;
if (LogStream.level > 2) {
log.println("NtlmHttpFilter: " + ntlm + " successfullyauthenticated against " + dc);
}
} catch (SmbAuthException sae) {
LogStream _tmp1 = log;
if (LogStream.level > 1) {
log.println("NtlmHttpFilter: " + ntlm.getName() + ":0x" + Hexdump.toHexString(sae.getNtStatus(), 8) + ": " + sae);
}
SmbAuthException _tmp2 = sae;
if (sae.getNtStatus() == 0xc0000005) {
HttpSession ssn = req.getSession(false);
if (ssn != null) {
ssn.removeAttribute("NtlmHttpAuth");
}
}
resp.setHeader("WWW-Authenticate", "NTLM");
if (offerBasic) {
resp.addHeader("WWW-Authenticate", "Basicrealm=\"" + realm + "\"");
}
resp.setStatus(401);
resp.setContentLength(0);
resp.flushBuffer();
return null;
}
req.getSession().setAttribute("NtlmHttpAuth", ntlm);
} else if (!skipAuthentication) {
HttpSession ssn = req.getSession(false);
if (ssn == null || (ntlm = (NtlmPasswordAuthentication)ssn.getAttribute("NtlmHttpAuth")) == null) {
resp.setHeader("WWW-Authenticate", "NTLM");
if (offerBasic) {
resp.addHeader("WWW-Authenticate", "Basicrealm=\"" + realm + "\"");
}
resp.setStatus(401);
resp.setContentLength(0);
resp.flushBuffer();
return null;
}
}
return ntlm;
}
}
Web.Xml中配置
<servlet>
<servlet-name>myadservlet</servlet-name>
<servlet-class>com. company.test.ADServlet</servlet-class>
<init-param>
<param-name>jcifs.http.domainController</param-name>
<param-value>172.16.2.101</param-value>
</init-param>
<init-param>
<param-name>jcifs.netbios.wins</param-name>
<param-value>172.16.2.101,172.16.2.105</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>dns. company.net.cn</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.soTimeout</param-name>
<param-value>18000</param-value>
</init-param>
<init-param>
<param-name>jcifs.netbios.cachePolicy</param-name>
<param-value>1200</param-value>
</init-param>
<init-param>
<param-name>jcifs.util.loglevel</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
若要解决此问题,从客户端,使用注册表编辑器 (Regedt32.exe) 将值添加到以下注册表项:
HKEY_CURRENT_USER/软件/microsoft/windows/CurrentVersion/internet设置 /
注意上面的注册表项是一个路径,它经过了折行以提高可读性。
添加以下注册表值:
值名称: DisableNTLMPreAuth
数据类型: REG_DWORD
值: 1
除了注册表项还需要关闭 Internet Explorer 中 启用集成 Windows 身份验证。 若要这样做,请按照下列步骤操作:
启动 Internet Explorer。
单击 工具,请单击 Internet 选项,然后单击 高级 选项卡。
在 安全,下单击以取消选择 启用集成 Windows 身份验证 (需要重启动),然后单击 应用。
关闭 Internet Explorer。
若要解决此问题,从服务器端,配置网站以使用下列身份验证方法之一:
若要允许匿名访问仅网站进行配置。
配置为允许匿名访问和 NLTM 身份验证 (集成 Windows 身份验证) 的网站
分享到:
相关推荐
jcifs.jar支持域单点登录。只是jcifs.jar包。之前项目用过还不错。
集成登录,又称为单点登录(Single Sign-On, SSO),是企业信息系统中一种常见的身份验证机制。它的核心理念是用户只需要进行一次身份验证,即可访问多个相互关联的系统,无需重复输入用户名和密码。这种机制显著...
在IT领域,特别是企业网络管理中,Active Directory(AD)域单点登录(Single Sign-On,简称SSO)是一项至关重要的技术。它允许用户在验证一次身份后,无需再次输入凭证即可访问多个受保护的资源。NT LAN Manager...
在Web应用中,如果需要与Windows域集成,比如让内部员工通过域账号登录,就可以使用NtlmHttpFilter来实现这个功能。 在描述中提到的博文链接指向了iteye博客的一个文章,虽然具体内容没有提供,但通常这样的文章会...
6. **单点登录(Single Sign-On, SSO)原理**:虽然标签中提到了“单点登录代码”,但jcifs本身并不直接提供SSO功能。不过,jcifs可以作为实现SSO的一个组件,因为它能处理网络认证。如果你打算开发SSO系统,理解...
CAS是实现单点登录的重要组件,简化了用户认证流程。当遇到Maven下载问题时,可以考虑手动添加依赖到项目。而Samba则是在操作系统层面上实现SMB协议,使得非Windows系统也能与Windows网络进行交互。
这个包是基于Java的CIFS(Common Internet File System)客户端实现,允许Java应用程序与遵循SMB(Server Message Block)协议的服务器进行交互,比如Windows、Linux和某些NAS设备。SMB是一种广泛使用的网络文件共享...
jcifs-1.3.18.jar包,SSO单点登录
jcifs (Java CIFS Client Library) 是一个开源的 Java 库,它实现了客户端接口文件系统(Client Interface File System, CIFS),也称为 SMB 协议,允许 Java 应用程序访问网络共享资源,如 Windows 文件服务器或 ...
jcifs-ext-0.9.4.jar便是这样一个关键的拓展包,它为Java应用程序提供了与Windows网络身份验证交互的能力,特别是在实施单点登录(Single Sign-On, SSO)系统如CAS(Central Authentication Service)时。...
jcifs-1.3.19.jar 包,用于SMB协议 ,以实现远程读取文件。jcifs-1.3.19.jar 包,用于SMB协议 ,以实现远程读取文件。
【jcifs的拓展包ext】是Java社区中用于处理网络文件共享协议的一个扩展库,主要针对JCIFS(Java Common Internet File System)进行增强。JCIFS是一个开源的Java库,实现了SMB(Server Message Block)协议,允许...
在Java中实现AD域用户登录验证,主要涉及到以下知识点: 1. **JNDI (Java Naming and Directory Interface)**: JNDI 是Java平台的标准API,它提供了一种统一的方式来访问各种命名和目录服务,包括AD域。通过JNDI,...
4. **域环境支持**:在Windows域环境中,jcifs能够处理域用户和组的权限,使得在域内的文件操作更加顺畅。 5. **异步操作**:jcifs库提供了异步I/O操作,可以在后台线程中执行文件操作,避免阻塞主线程,提高程序的...
Java Community Interface for File Sharing (JCIFS) 是一个开源的Java库,它允许Java应用程序能够访问和操作Microsoft的网络文件共享协议,例如SMB(Server Message Block)和CIFS(Common Internet File System)...
jcifs实现SSO,SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是...
jcifs-1.2.3.jar 包 摘要必须大于50个字节!摘要必须大于50个字节!摘要必须大于50个字节!
jcifs-1.3.14.jar是jcifs库的一个版本,提供了对CIFS协议的支持,使得Java开发者可以实现跨平台的文件共享和传输。 CIFS(Common Internet File System)是一种广泛使用的文件共享协议,尤其在Windows环境中。它...
在Java编程环境中,jcifs-1.3.15.jar是一个非常重要的库,它使得开发者能够方便地处理SMB(Server Message Block)协议,也就是Windows操作系统中常用的文件共享协议。这个库允许Java程序访问局域网内的共享文件,...