`
jamesby
  • 浏览: 383402 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
最近开发一个新项目采用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的配置。
分享到:
评论
8 楼 jamesby 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的机制是什么?当然问题是解决了,但是原理没有搞懂!
7 楼 jamesby 2007-02-09  
问题原因找到了,我的首页有这样一段动态生成图片的代码
<img src="http://192.168.1.143/site/bigpic/drawPicture.jsp" width="138" height="94" border=0>
导致session冲突,服务每次被访问都会新建立session对象,具体为什么会冲突稍后再好好总结一下,感谢各位的答复,多谢!
6 楼 jamesby 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!
5 楼 pikachu 2007-02-08  
jamesby 写道
男儿当 写道
路过!多一句嘴.我以前好像有过一次是这样,记得好像清空了一次浏览器的临时文件和cookie.不知道你是不是这种情况.
清了好多次了,关键是好几台机器对服务器的访问都不正常.
大家使用Spring MVC都是如何处理用户登录的,能否贴段用户登录的代码上来?
我这样使用Spring是否正确,希望能多给点建议.
明天写一个Session 的Listener监测下Session的创建和销毁的情况,希望能有所收获,马上要上线了,出了这个莫名其妙的问题.哎... ...


和server端没有太大的关系

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

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

建议楼主去掉以上的代码再试试看

相关推荐

    nginx反向代理导致session失效的问题解决

    经了解,他对同一个项目使用tomcat部署了两个环境,一个在开发服务器上,一个在他本机,两个环境代码配置完全相同。两边通过同一个nginx进行反向代理,nginx配置大致如下, location /health/ { proxy_pass ...

    一个用户只能在台机器访问服务器

    3. **会话超时和销毁**:设定合理的会话超时策略,当用户长时间无操作或者在新设备登录时,服务器应强制旧的Session失效。这样可以防止未授权的设备访问已登录的账户。 4. **实时监控**:通过日志分析和实时监控,...

    IFrame中Session丢失的解决办法

    在Web.Config文件中配置`sessionState`元素,设置`mode`属性为`StateServer`,并指定`stateConnectionString`,这使得Session数据不在本地存储,而是通过TCP/IP连接到一个独立的State Server服务,从而避免了由于...

    Tomcat7+Redis+Session 负载之后session 共享 tomcat jar包

    描述中的"nignx 进行负载后session失效的完美解决,亲测可用"进一步确认了这个问题的解决方案是有效的。 在Web应用的高并发场景下,通常会采用负载均衡技术来分发请求到多个服务器,提高系统的可用性和响应速度。...

    分布式session方案

    缺点:缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的 Session 信息都将失效。 实现方式:可以使用 Nginx 的 upstream 模块配置 ip_hash 属性来实现粘性 Session。 第二种:服务器...

    Tomcat_redis_Session共享

    `Tomcat_redis_Session共享`指的是在使用Apache Tomcat服务器时,通过Redis来实现Session的共享。这种做法在分布式系统或者微服务架构中尤为常见,因为它可以有效地解决多台服务器之间Session同步的问题。 首先,...

    apache,tomcat负载均衡和session复制

    在多台Tomcat服务器之间进行session复制,意味着当一个用户在某台服务器上创建或更新session时,该session会被复制并分发到其他服务器,确保用户在集群中的任何一台服务器上都能访问到相同的状态信息。 1. **复制...

    redis 集群共享Session

    - **负载均衡器配置**:在负载均衡器如Nginx上,可以配置不依赖SessionID的分发策略,如IP Hash,确保同一用户请求始终被分发到同一台服务器,保证Session的一致性。 5. **安全性考虑** 尽管Redis提供了安全性,...

    网页session的一些常见问题并解决方案

    或者使用Cookie来保存用户信息,当检测到Session失效时,引导用户重新登录。 二、Session存储方式选择 默认情况下,ASP.NET使用In-Proc模式,即Session数据存储在Web服务器的内存中。这种方式效率高,但服务器重启...

    解决前后端分离 vue+springboot 跨域 session+cookie失效问题

    3. **代理服务器**:使用Nginx或其他反向代理服务器,让Vue应用请求通过代理服务器转发到Spring Boot应用,这样所有请求都在同一个域下,避免跨域问题,同时Session可以正常工作。 综上所述,解决Vue+Spring Boot...

    nginx session共享的问题.docx

    1. IP Hash:Nginx的ip_hash技术可以根据客户端IP地址的哈希值将请求路由到特定的后端服务器,从而确保来自同一IP的请求总是被发送到同一台服务器,保持session的连续性。配置ip_hash的方法是在upstream块中添加`ip_...

    Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    当用户在任一服务器上创建session时,session数据会被保存到Redis中,其他服务器可以通过连接Redis获取该用户的session信息,从而实现跨服务器的session共享,保证用户会话的连续性。 最后,Keepalived是一种为高...

    电信设备-学习用于SIP信令服务器的地址转换设备内的地址绑定的失效时间.zip

    SIP信令服务器通常位于公共网络上,而许多用户设备可能在私有网络后面,通过NAT进行访问。当SIP客户端(如VoIP电话或软电话)发起呼叫时,它们会向SIP服务器发送带有私有IP地址和端口号的请求。由于这些地址在公网不...

    三、Nginx+Tomcat+Redis实现Session共享

    Nginx通过配置不同的负载均衡策略,如轮询、权重轮询、IP哈希等,可以有效地分配请求,避免单一服务器过载。 2. **Tomcat应用服务器**: Tomcat 是一个开源的Java Servlet容器,用于部署和运行Java Web应用程序。...

    redis集群session共享jar包之tomcat7

    总之,通过集成Redis集群和Tomcat7,我们可以实现高效且可靠的Session共享,这对于扩展Web应用的并发处理能力、提高用户体验以及实现跨服务器的用户会话管理具有重要意义。这个过程涉及多个层面的配置和调优,但是...

    nginx+tomcat+memcached实现session共享

    可以通过访问应用并观察请求被转发到哪个服务器,以及在Memcached中查看session是否存储和更新来验证。 为了优化性能和可靠性,可以考虑以下几点: 1. 考虑使用更高级的负载均衡策略,如一致性哈希。 2. 定期检查...

    计算机网络.docx

    首次访问时,服务器为客户端分配一个唯一的Session ID,并通过Cookie返回给客户端。之后,客户端只需要携带这个ID进行通信,服务器根据ID查找相应的Session信息。若Cookie不可用,还可以通过URL重写等方式进行会话...

    关于Iframe如何跨域访问Cookie和Session的解决方法

    在Web开发中,Iframe(内联框架)常用于嵌入其他网页内容,但涉及到跨域访问时,尤其是在处理Cookie和Session时,会遇到一些挑战。本文主要探讨如何解决Iframe跨域访问Cookie和Session的问题。 首先,理解跨域访问...

    Asp.Net程序目录下文件夹或文件操作导致Session失效的解决方案

    总结来说,当***应用程序目录下的文件夹或文件发生操作导致Session失效时,可以通过以上两个方面来解决。一是通过配置web.config文件中的Session状态管理方式来避免因应用程序域回收导致的Session失效问题,二是通过...

Global site tag (gtag.js) - Google Analytics