论坛首页 Java企业应用论坛

通过IP访问服务器session失效,计算机名则可以,什么原因?

浏览 5525 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-08  
最近开发一个新项目采用Spring MVC+Spring+iBatis结构,出现了一个奇怪的现象,通过计算机名称可以正常访问,并且一切正常。而通过IP访问则会出现一个奇怪的现象:
登录系统后随便点哪个链接都会退出系统。下面贴出我的部分代码:

配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="encodingInterceptor" class="com.cm.web.interceptor.EncodingInterceptor"/>
	<bean id="securityInterceptor" class="com.cm.web.interceptor.SecurityInterceptor"/>
	<bean id="exceptionResolver"   class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">        
		<property name="defaultErrorView">            
			<value>error</value>        
		</property>        
		<property name="exceptionMappings">            
			<props>                
				<prop key="java.lang.Exception">error</prop>            
			</props>        
		</property>    
	</bean>
	
	<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
		<property name="basename"><value>cm</value></property>
		<property name="defaultParentView"><value>modelView</value></property>
	</bean>
	<!--Not Need Logon.......................-->
	<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="interceptors">
			<list>
				<ref local="encodingInterceptor"/>
			</list>
		</property>		
		<property name="mappings">
			<props>
				<prop key="/login.do">accountController</prop>
				<prop key="/loginproc.do">accountController</prop>
				<prop key="/passwordmod.do">accountController</prop>
				<prop key="/passmodprocess.do">accountController</prop>
				<prop key="/forgetpassword.do">accountController</prop>
				<prop key="/forgetpasswordprocess.do">accountController</prop>
			</props>
		</property>
	</bean>
	<!--Need Logon....................................-->
	<bean id="securityUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="interceptors">
			<list>
				<ref local="encodingInterceptor"/>
				<ref local="securityInterceptor"/>
			</list>
		</property>		
		<property name="mappings">
			<props>
				<prop key="/index.do">indexController</prop>
				<prop key="/resource/resourceIndex.do">indexController</prop>
				<prop key="/department/departmentMember.do">indexController</prop>
				<prop key="/index/linkmanGcheng.do">indexController</prop>
				<prop key="/index/linkmanJsdw.do">indexController</prop>
				<prop key="/index/linkmanXy.do">indexController</prop>
				<prop key="/index/customerXyIndex.do">indexController</prop>
				<prop key="/index/customerDZD.do">indexController</prop>
			</props>
		</property>
	</bean>

	<bean id="cmMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
		<property name="mappings">
			<props>
				<prop key="/login.do">handleLoginView</prop>
				<prop key="/loginproc.do">handleLoginProcess</prop>
				<prop key="/index.do">handleIndex</prop>
				<prop key="/passwordmod.do">handleModifyPasswordView</prop>
				<prop key="/passmodprocess.do">handleModifyPasswordProcess</prop>
				<prop key="/forgetpassword.do">handelForgetPassword</prop>
				<prop key="/forgetpasswordprocess.do">handleForgetPasswordProcess</prop>
				<prop key="/resource/resourceIndex.do">handelIndexResource</prop>
				<prop key="/department/departmentMember.do">handleDepartmentMember</prop>
				<prop key="/index/linkmanGcheng.do">handleLinkmanGcheng</prop>
				<prop key="/index/linkmanJsdw.do">handleLinkmanJsdw</prop>
				<prop key="/index/linkmanXy.do">handleLinkmanXy</prop>
				<prop key="/index/customerXyIndex.do">handleCustomerXyIndex</prop>				
				<prop key="/index/customerDZD.do">handleIndexCustomerDZD</prop>
			</props>
		</property>
	</bean>
	
	<bean id="accountController" class="com.cm.web.controller.AccountController">
		<property name="methodNameResolver"><ref local="cmMethodNameResolver"/></property>
		<property name="userService"><ref bean="userService"/></property>
	</bean>
	
	<bean id="indexController" class="com.cm.main.web.controller.IndexController">
		<property name="methodNameResolver"><ref local="cmMethodNameResolver"/></property>
		<property name="generalService"><ref bean="generalService"/></property>
		<property name="userService"><ref bean="userService"/></property>
	</bean>	


</beans>


登录代码

public class AccountController extends AbstractSuperController {

	//登录系统代码
	public ModelAndView handleLoginProcess(HttpServletRequest request,
			HttpServletResponse response) throws ServletException {
		try {
			User user = new User();
			String username = request.getParameter("username");
			String password = request.getParameter("password");
			user.setName(username);
			user.setPassword(password);
			user = userService.selectUserByUsernameAndPassword(user);
			if (null != user) {
				log.info("User " + user.getName() + " Department "
						+ user.getCmdeptname() + " logon...................");
				HttpSession session = request.getSession(true);
				session.setMaxInactiveInterval(3600);
				//WebUtils.setSessionAttribute(request, "user", user);
				session.setAttribute("user", user);
				Cookie cookie = new Cookie("username", encode(username));
				cookie.setMaxAge(60 * 60 * 24 * 365);
				response.addCookie(cookie);				
				return new ModelAndView(new RedirectView("/cm/index.do"));
			}
		} catch (Exception e) {
			log.error("", e);
		}
		return new ModelAndView(new RedirectView("/cm/login.do"));
	}
}



拦截器代码
public class SecurityInterceptor extends HandlerInterceptorAdapter {
	protected final Log log = LogFactory.getLog(SecurityInterceptor.class);
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		
		//		User user = (User) WebUtils.getSessionAttribute(request, "user");
		//		if (user == null) {
		//			ModelAndView modelAndView = new ModelAndView(new RedirectView(
		//					"/cm/login.do"));
		//			log.info("user is
		// logout.............................................");
		//			throw new ModelAndViewDefiningException(modelAndView);
		//		} else {
		//			return true;
		//		}
		ModelAndView modelAndView = new ModelAndView(new RedirectView(
				"/cm/login.do"));
		HttpSession session = request.getSession(false);
		if (null == session)
		{
			throw new ModelAndViewDefiningException(modelAndView);
		}
		User user = (User) session.getAttribute("user");
		if (user == null) {
			log.info("#user is logout.............");
			throw new ModelAndViewDefiningException(modelAndView);
		}
		return true;

	}
}


因为我在拦截器中配置session失效则自动到首页。
在login.jsp页面写如下代码:

<%
java.util.Enumeration headers = request.getHeaderNames();
while(headers.hasMoreElements())
{
   String headName = (String)headers.nextElement();
   String headValue = request.getHeader(headName);
   out.println(headName+"="+headValue+"<br>");
}
%>


打印出的结果如下:

JSESSIONID=FKyzH2hmpdjJ2vZrZjY0HvM68K4FnvnDTrwLJm4ZT0hwR121tCCS!-401940707
JSESSIONID=FKyF42pkgshMDlKzPnv6tP196b2wrGqJH1Q4wVrhBTJSj16JnJm3!-401940707
JSESSIONID=FKyhDPvVrZ2zJfJkyCNQLTyDy2QBZ2ym6ZhsPJKGVQw19KxZm1Jm!-401940707


只贴出了JSESSIONID的部分,我奇怪的是为什么浏览器会发送不同的JSESSIONID.
而通过计算机名称访问则没有任何问题。另外在本机部署一个老的应用用Struts开发,无论通过IP还是计算机名访问都无问题,第一次碰到这种问题,束手无策,另外声明我在web.xml中没有进行任何有关session的配置。
   发表时间:2007-02-08  

Cookie cookie = new Cookie("username", encode(username));   
cookie.setMaxAge(60 * 60 * 24 * 365);   
response.addCookie(cookie);                

建议楼主去掉以上的代码再试试看
0 请登录后投票
   发表时间:2007-02-08  
magice 写道

Cookie cookie = new Cookie("username", encode(username));   
cookie.setMaxAge(60 * 60 * 24 * 365);   
response.addCookie(cookie);                

建议楼主去掉以上的代码再试试看
这个只是用户成功登录后将用户名保存到cookie中,以后用户访问系统不需要输入用户名,我的那个用struts写的程序也有这段代码,我是拷贝过来的!

现在不能试验,明早上班试验下,另外我测试过将securityInterceptor去掉,也是会有同样的问题,基本判断应该与securityInterceptor无关,晕,关键是通过http://hostname:80/cm 访问没有问题,而通过http://192.168.1.143:80 则有问题,奇怪的很!

而且通过http://192.168.1.143:80/cm 这种方式访问也不是每次都失败,不过基本5次会有4次是失败的.
0 请登录后投票
   发表时间:2007-02-08  
路过!多一句嘴.我以前好像有过一次是这样,记得好像清空了一次浏览器的临时文件和cookie.不知道你是不是这种情况.
0 请登录后投票
   发表时间:2007-02-08  
男儿当 写道
路过!多一句嘴.我以前好像有过一次是这样,记得好像清空了一次浏览器的临时文件和cookie.不知道你是不是这种情况.
清了好多次了,关键是好几台机器对服务器的访问都不正常.
大家使用Spring MVC都是如何处理用户登录的,能否贴段用户登录的代码上来?
我这样使用Spring是否正确,希望能多给点建议.
明天写一个Session 的Listener监测下Session的创建和销毁的情况,希望能有所收获,马上要上线了,出了这个莫名其妙的问题.哎... ...
0 请登录后投票
   发表时间:2007-02-08  
jamesby 写道
男儿当 写道
路过!多一句嘴.我以前好像有过一次是这样,记得好像清空了一次浏览器的临时文件和cookie.不知道你是不是这种情况.
清了好多次了,关键是好几台机器对服务器的访问都不正常.
大家使用Spring MVC都是如何处理用户登录的,能否贴段用户登录的代码上来?
我这样使用Spring是否正确,希望能多给点建议.
明天写一个Session 的Listener监测下Session的创建和销毁的情况,希望能有所收获,马上要上线了,出了这个莫名其妙的问题.哎... ...


和server端没有太大的关系

浏览器什么类型?版本?安全设置如何?有没有禁用cookie?
把浏览器安全级别先都降到最低看看
0 请登录后投票
   发表时间:2007-02-08  
pikachu 写道
jamesby 写道
男儿当 写道
路过!多一句嘴.我以前好像有过一次是这样,记得好像清空了一次浏览器的临时文件和cookie.不知道你是不是这种情况.
清了好多次了,关键是好几台机器对服务器的访问都不正常.
大家使用Spring MVC都是如何处理用户登录的,能否贴段用户登录的代码上来?
我这样使用Spring是否正确,希望能多给点建议.
明天写一个Session 的Listener监测下Session的创建和销毁的情况,希望能有所收获,马上要上线了,出了这个莫名其妙的问题.哎... ...


和server端没有太大的关系

浏览器什么类型?版本?安全设置如何?有没有禁用cookie?
把浏览器安全级别先都降到最低看看
浏览器IE6.0,安全设置都是默认设置,没有禁用cookies.

关键是服务器也部署另外一个web应用,而且无论通过hostname还是IP访问该应用都没有这个问题!

我先前也怀疑浏览器的问题!但是访问同一台机器的其它应用就可以这没有道理啊.

而且也不可能那么多的机器的浏览器都有问题,我测试了三太机器访问,都出现这种现象,app server为weblogic 8.1.3!
0 请登录后投票
   发表时间:2007-02-09  
问题原因找到了,我的首页有这样一段动态生成图片的代码
<img src="http://192.168.1.143/site/bigpic/drawPicture.jsp" width="138" height="94" border=0>
导致session冲突,服务每次被访问都会新建立session对象,具体为什么会冲突稍后再好好总结一下,感谢各位的答复,多谢!
0 请登录后投票
   发表时间:2007-02-09  
在本机看到如下Cookies内容:
Name  Internet Address
cm/   Cookie:机器名@192.168.1.143/cm
cm/   Cookie:机器名@服务器名/cm
site/ Cookie:机器名@192.168.1.143/site
site/ Cookie:机器名@服务器名/site

浏览器应该根据Internet Address来发送相应的Cookie文件的内容吧,如果是这样,那为什么我的cm应用首页中引用了一个site应用的动态图片就出现session冲突的情况呢?

正常情况应该是浏览器将Internet Address为Cookie:机器名@192.168.1.143/cm的Cookie文件内容发送到我的cm应用,登录到首页访问site的动态图片,则发送Internet Address为“Cookie:机器名@192.168.1.143/site”给我的site应用(不是cm应用)。

不过现在感觉是浏览器错误的将Internet Address为“Cookie:机器名@192.168.1.143/site”发送给了我的cm应用。

浏览器发送Cookie的机制是什么?当然问题是解决了,但是原理没有搞懂!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics