首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

ssh2框架单用户登录解决思路

2013-09-14 
ssh2框架单用户登录我现在在做一个ssh2系统,客户想让用户实现单用户登录,比如一个账号登录了,在另一台电脑

ssh2框架单用户登录
我现在在做一个ssh2系统,客户想让用户实现单用户登录,比如一个账号登录了,在另一台电脑上登录该账号,则之前登录的那台电脑中的用户就不能使用了(可以出现“用户已在其他地区登录”这样的说明),我的是ssh2+spring security(spring权限验证),请问这样的怎样做,谢谢。

[解决办法]
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控制相同用户登录是否顶替已登录用户
[解决办法]
(1)在数据库建一张用户信息表和一张存放session信息的表,表之间通过userid关联;

(2)在登录页面根据登录的用户名和密码,生成一个新的session信息写到session表里,同时开启session,更新登录用户的时间戳;

(3)登录成功后判断该用户是不是在其他地方已登录(根据session表的信息可以判断),如果有的话强制退出用户,弹出“用户已在其他地区登录”提示信息,并删除旧有的session记录信息。
[解决办法]
引用:
Quote: 引用:

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>


<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标签内的
[解决办法]
引用:
Quote: 引用:

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啊?

不需要写任何代码管理session。
spring security session管理需要在http标签内添加后才会有效的
你检查下http标签内有没有配置上

热点排行