ssh2框架单用户登录

woshigeshou123 2013-09-01 04:46:37
我现在在做一个ssh2系统,客户想让用户实现单用户登录,比如一个账号登录了,在另一台电脑上登录该账号,则之前登录的那台电脑中的用户就不能使用了(可以出现“用户已在其他地区登录”这样的说明),我的是ssh2+spring security(spring权限验证),请问这样的怎样做,谢谢。
...全文
333 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenw323 2013-09-05
  • 打赏
  • 举报
回复
引用 17 楼 woshigeshou123 的回复:
[quote=引用 16 楼 chenw323 的回复:] web.xml这样配置

<!-- Spring Secutiry3配置  -->
	<filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- security session管理 -->
    <listener>
    	<listener-class>
    		org.springframework.web.context.ContextLoaderListener
    	</listener-class>
    </listener>
    <listener>
    	<listener-class>
    		org.springframework.security.web.session.HttpSessionEventPublisher
    	</listener-class>
    </listener>
就是按照这个配置来的,还是不行。是不是要自己写代码管理session啊?[/quote] 不需要写任何代码管理session。 spring security session管理需要在http标签内添加后才会有效的 你检查下http标签内有没有配置上
woshigeshou123 2013-09-05
  • 打赏
  • 举报
回复
引用 16 楼 chenw323 的回复:
web.xml这样配置

<!-- Spring Secutiry3配置  -->
	<filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- security session管理 -->
    <listener>
    	<listener-class>
    		org.springframework.web.context.ContextLoaderListener
    	</listener-class>
    </listener>
    <listener>
    	<listener-class>
    		org.springframework.security.web.session.HttpSessionEventPublisher
    	</listener-class>
    </listener>
就是按照这个配置来的,还是不行。是不是要自己写代码管理session啊?
woshigeshou123 2013-09-04
  • 打赏
  • 举报
回复
引用 10 楼 chenw323 的回复:
spring security就可以实现单用户登录

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
		<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry"></beans:constructor-arg>
		<beans:property name="maximumSessions" value="1"></beans:property>
		<!-- 后登录的用户不能顶替前面已登录的用户 
		<beans:property name="exceptionIfMaximumExceeded" value="true"></beans:property>
		-->
	</beans:bean>
maximumSessions 控制相同用户session数量 exceptionIfMaximumExceeded控制相同用户登录是否顶替已登录用户
为啥不好使呢,我再web.xml中也添加了 <listener> <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> </listener>
chenw323 2013-09-04
  • 打赏
  • 举报
回复
web.xml这样配置

<!-- Spring Secutiry3配置  -->
	<filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- security session管理 -->
    <listener>
    	<listener-class>
    		org.springframework.web.context.ContextLoaderListener
    	</listener-class>
    </listener>
    <listener>
    	<listener-class>
    		org.springframework.security.web.session.HttpSessionEventPublisher
    	</listener-class>
    </listener>
chenw323 2013-09-04
  • 打赏
  • 举报
回复
引用 14 楼 woshigeshou123 的回复:
[quote=引用 10 楼 chenw323 的回复:] spring security就可以实现单用户登录

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
		<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry"></beans:constructor-arg>
		<beans:property name="maximumSessions" value="1"></beans:property>
		<!-- 后登录的用户不能顶替前面已登录的用户 
		<beans:property name="exceptionIfMaximumExceeded" value="true"></beans:property>
		-->
	</beans:bean>
maximumSessions 控制相同用户session数量 exceptionIfMaximumExceeded控制相同用户登录是否顶替已登录用户
为啥不好使呢,我再web.xml中也添加了 <listener> <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> </listener>[/quote]

<http use-expressions="true" entry-point-ref="loginUrlEntryPoint">
		<intercept-url pattern="/common/error.jsp" filters="none"/>
		<intercept-url pattern="/common/403.jsp" filters="none"/>
		<intercept-url pattern="/checkCode.do" filters="none"/>
		<intercept-url pattern="/noLogin.do" filters="none"/>
		<intercept-url pattern="/sessionConcurrent.do" filters="none"/>
		<intercept-url pattern="/login.do" filters="none"/>
		<intercept-url pattern="/checkPwd.do" filters="none"/>
		<intercept-url pattern="/js/**" filters="none" />
		<intercept-url pattern="/css/**" filters="none" />
		<intercept-url pattern="/image/**" filters="none" />
		<intercept-url pattern="/*.ico" filters="none" />
		<intercept-url pattern="/workflow/uploadResource.do" filters="none"/>
		<intercept-url pattern="/**" access="isAuthenticated()"/>
		<access-denied-handler ref="accessDeniedHandler"/>
		<intercept-url pattern="/common/upload.do" filters="none"/>
		<intercept-url pattern="/common/deleteAttachFile.do" filters="none"/>
		<intercept-url pattern="/phone/**" filters="none"/>
		
		<custom-filter ref="customFilter" before="FILTER_SECURITY_INTERCEPTOR"/>
		<!-- 登录 -->
		<custom-filter ref="loginFilter" before="FORM_LOGIN_FILTER"  />
        <!-- 退出 -->
        <custom-filter position="LOGOUT_FILTER" ref="logoutFilter"/>
        <!-- session管理 防止session并发 -->
        <custom-filter ref="concurentFilter" position="CONCURRENT_SESSION_FILTER"/>
       	<session-management session-authentication-strategy-ref="sas"/>
	</http>
要把session控制添加到http标签内的
yxinf 2013-09-03
  • 打赏
  • 举报
回复
(1)在数据库建一张用户信息表和一张存放session信息的表,表之间通过userid关联; (2)在登录页面根据登录的用户名和密码,生成一个新的session信息写到session表里,同时开启session,更新登录用户的时间戳; (3)登录成功后判断该用户是不是在其他地方已登录(根据session表的信息可以判断),如果有的话强制退出用户,弹出“用户已在其他地区登录”提示信息,并删除旧有的session记录信息。
无聊找乐 2013-09-03
  • 打赏
  • 举报
回复
把sessonid存到数据库,然后在用户登录是查数据库判断, 如果想速度快点也可以存到Application下
GP0071 2013-09-03
  • 打赏
  • 举报
回复
我的想法是你可以建立一张表,在用户登录时将用户名和机器的IP存储到表中,这样每当用户进行跳转操作时,就针对用户名和IP进行下比对,如果相同则继续操作,否则抛出提示。 缺点:每次跳转都要访问库,进行用户信息的比对。 优化方案:建议做成缓存,将用户名对应ip缓存到系统内存中,在跳转时做一个strut2的拦截器,从缓存中获取用户信息进行比对。
chenw323 2013-09-03
  • 打赏
  • 举报
回复
spring security就可以实现单用户登录

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
		<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry"></beans:constructor-arg>
		<beans:property name="maximumSessions" value="1"></beans:property>
		<!-- 后登录的用户不能顶替前面已登录的用户 
		<beans:property name="exceptionIfMaximumExceeded" value="true"></beans:property>
		-->
	</beans:bean>
maximumSessions 控制相同用户session数量 exceptionIfMaximumExceeded控制相同用户登录是否顶替已登录用户
蛋黄车 2013-09-02
  • 打赏
  • 举报
回复
你这个功能不是单点登录做的,单点登录是用于多个应用的之间的重复登录问题。 不能重复登录这个可以在服务器端后台来做,方式有多种,比如表中增加是否登录标记,每次登录验证、更新
剑神一笑 2013-09-02
  • 打赏
  • 举报
回复
没什么好办法
woshigeshou123 2013-09-02
  • 打赏
  • 举报
回复
没人知道吗?
s478853630 2013-09-02
  • 打赏
  • 举报
回复
如果只有一台服务器,你可以用application根据用户登录名保存sessionId, 然后在拦截器或过滤器中比较之前的sessionId和当前的sessionId是否相同, 就能判断出该用户是否为单点登录了,如果sessionId不同,说明该用户已经在其它电脑或浏览器登录了 如果是服务器集群,就会有多个application,每台服务器给同一个浏览器分配的sessionId也不相同, application和session就不能再用了,可以使用公用的缓存服务器来解决这个问题 我们公司都用redis
剑神一笑 2013-09-02
  • 打赏
  • 举报
回复
引用 6 楼 cbxjj 的回复:
1个问题解决就好办 1.IE用户直接点右上角的x关闭网页时间怎么捕获(ALT+f4) 2.多tab浏览器,如FF/google chrome/IE8/9等关掉该TAB怎么捕获(CTRL+w) 这2个问题解决不了,这个需求还是考虑怎么去跟客户解释去掉这个功能比较好。 或者自己写个浏览器,制作一个客户端,强制客户使用自己的浏览器登录,比如招行网银客户端。
不好意思,看错需求了 你这种是可以实现的 sessionId存入数据库判断一下就OK了, 如果是一用户登录,同一用户在其他地方登录会失败是没法解决的
zyrobert 2013-09-02
  • 打赏
  • 举报
回复
用sessionlistener来做 还是很方便的 我也给个地址:http://www.cnblogs.com/jackyrong/archive/2010/03/04/1678688.html
剑神一笑 2013-09-02
  • 打赏
  • 举报
回复
1个问题解决就好办 1.IE用户直接点右上角的x关闭网页时间怎么捕获(ALT+f4) 2.多tab浏览器,如FF/google chrome/IE8/9等关掉该TAB怎么捕获(CTRL+w) 这2个问题解决不了,这个需求还是考虑怎么去跟客户解释去掉这个功能比较好。 或者自己写个浏览器,制作一个客户端,强制客户使用自己的浏览器登录,比如招行网银客户端。
悲剧的人参 2013-09-02
  • 打赏
  • 举报
回复
spring security内置这种功能,如果你要自己做,则可以做一个线程池管理。
  • 打赏
  • 举报
回复
别人说用spring security 可以实现,不会。。。 我用的 这种方式,用起来非常不错,不懂就问我吧 http://blog.csdn.net/chenghui0317/article/details/9373345

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧