精华内容
下载资源
问答
  • Base.php基本控制里写好登录信息的判断/***检查是否已登录:防止重复登录,放在登录验证方法中调用*/publicfunctionlogined(){if(Session::has('user_id')){$this->error('您已登录过了!','index/index');}}/***...

    需要引用Session类哦!

    use think\facade\Session;

    Base.php基本控制里写好登录信息的判断/**

    * 检查是否已登录:防止重复登录,放在登录验证方法中调用

    */

    public function logined()

    {

    if(Session::has('user_id'))

    {

    $this->error('您已登录过了!', 'index/index');

    }

    }

    /**

    * 检查是否未登录:放在登录操作方法的最前面,如发布文章

    */

    public function isLogin()

    {

    if(!Session::has('user_id'))

    {

    $this->error('您还未登录,请移步到登录界面!', 'user/login');

    }

    }

    调用方法的例子:/**

    * 显示登陆页面

    */

    public function login()

    {

    //用户登陆前,先判断是否已经登录过了,防止重复登录

    $this->logined();

    $this->assign('title', '登陆首页');

    return $this->view->fetch('login');

    }/**

    * 显示添加文章界面

    */

    public function insert()

    {

    //用户发布文章前,先判断是否已经登录

    $this->isLogin();

    $this->assign('title', '发布文章');

    return $this->view->fetch();

    }

    展开全文
  • 推荐阅读:Java 多用户登录限制的实现方法现在有两种解决方案:1、将用户的登录信息用一个标志位的字段保存起来,每次登录成功就标记1,注销登录就标记为0,当标记为1的时候不允许别人登录。2、将用户的登录信息保存...

    目前web项目中,很多情况都是可以让同一个账户信息在不同的登录入口登录这次,这样子就不那么美好了。

    推荐阅读:

    Java 多用户登录限制的实现方法

    现在有两种解决方案:

    1、将用户的登录信息用一个标志位的字段保存起来,每次登录成功就标记1,注销登录就标记为0,当标记为1的时候不允许别人登录。

    2、将用户的登录信息保存在application内置作用域内, 然后利用session监听器监听每一个登录用户的登录情况。

    很显然,第一种方式 每次登录 都需要操作数据库,多了一些不必要的性能开销,而且在登录状态下 万一突然电脑关闭了,那就永远都不能登录了,可用性比较低。

    但是第二种方式就不一样了,可操作性强,很方便维护所有在线用户的信息。

    接下来 主要介绍第二种方式的具体实现:

    1、在处理登录的login方法中,先查询数据库验证下该用户是否存在,如果存在 判断该登录账户是否已经锁定了, 然后从application内置作用域对象中取出所有的登录信息,查看该username账户是否已经登录,如果登录了,就友好提示下,反之表示可以登录,将该登录信息以键值对的方式保存在application中。

    代码如下:

    //没有使用零配置前 每个访问的方法都要加上@Action ,否则404

    @Action(value="login", results={

    @Result(name="index", location="index.jsp"),

    })

    public String login() throws Exception {

    try{

    User result = userService.login(user.getFuUserName(), user.getFuPassword());

    if(result!=null){

    if(result.getFuStatus()!=null && result.getFuStatus()==0){

    super.setRequestAttr(Constant.MESSAGE, "抱歉,该用户已被锁定!");

    return "error";

    }

    Map loginUserMap = (Map) super.getApplicationAttr(Constant.LOGIN_USER_MAP);

    boolean isExist = false;

    String sessionId = super.getSessionId(false);

    if(loginUserMap==null){

    loginUserMap = new HashMap();

    }

    for (String username : loginUserMap.keySet()) {

    //判断是否已经保存该登录用户的信息 或者 如果是同一个用户进行重复登录那么允许登录

    if(!username.equals(result.getFuUserName()) || loginUserMap.containsValue(sessionId)){

    continue;

    }

    isExist = true;

    break;

    }

    if(isExist){

    super.setRequestAttr(Constant.MESSAGE, "抱歉,该用户已登录!");

    return "error";

    }else {

    loginUserMap.put(result.getFuUserName(), sessionId);

    }

    //登录成功

    super.setSessionAttr(Constant.LOGIN_USER, result);

    super.setApplicationAttr(Constant.LOGIN_USER_MAP, loginUserMap);

    logger.info(result.getFuUserName() + " 登录成功!");

    //如果 session中fromUrl有值,就跳转到该页面

    String fromUrl = (String)super.getSessionAttr(Constant.FROM_URL);

    if(fromUrl!=null){

    super.setSessionAttr(Constant.FROM_URL, null);

    super.getResponse().sendRedirect(fromUrl.toString());

    return null;

    }

    return "index";

    }

    }

    catch (Exception e) {

    e.printStackTrace();

    logger.info("登录失败: "+e.getMessage());

    }

    super.setRequestAttr("message", "用户名或密码错误");

    return "error";

    }

    2、登录入口处理完之后,考虑到会话结束的话,那么对应的登录用户也应该相应的注销登录。我们可以写一个Session监听器,监听sessioon销毁的时候,我们将登录的用户注销掉,也就是从application中移除。表示该用户已经下线了。

    代码如下:

    package com.facelook.util;

    import java.util.Map;

    import javax.servlet.http.HttpSessionEvent;

    import javax.servlet.http.HttpSessionListener;

    import org.apache.log4j.Logger;

    import com.facelook.entity.User;

    public class SessionListener implements HttpSessionListener{

    private Logger logger = Logger.getLogger(this.getClass());

    @Override

    public void sessionCreated(HttpSessionEvent event) {

    }

    @Override

    public void sessionDestroyed(HttpSessionEvent event) {

    //在session销毁的时候 把loginUserMap中保存的键值对清除

    User user = (User)event.getSession().getAttribute("loginUser");

    if(user!=null){

    Map loginUserMap = (Map)event.getSession().getServletContext().getAttribute("loginUserMap");

    loginUserMap.remove(user.getFuUserName());

    event.getSession().getServletContext().setAttribute("loginUserMap",loginUserMap);

    }

    }

    }

    web.xml中配置如下:

    com.facelook.util.SessionListener

    3、另外,还有一个问题,如果说登录的用户突然关闭了浏览器或者页面而没有点击退出按钮。那么可以利用beforeunload 事件,在浏览器刷新或者关闭的时候触发。

    //在刷新或关闭时调用的事件

    $(window).bind('beforeunload',function(){

    $.ajax({

    url:"${ctx}/system/user/user!logout.action",

    type:"post",

    success:function(){

    alert("您已退出登录");

    }

    });

    );

    但是如果一些客观原因,比如电脑突然关机,自动重启,等等,这些就没法避免了,所以只能等待服务器端的session会话重置之后才可以再登录。

    除非 做一个 统计所有在线人员的模块,管理员在里面进行在线人员的登录登出的状态管理,把那些有问题的登录用户直接销毁掉。

    接下来简单介绍下在线人员模块的管理:

    1、首先需要一个session监听器来监听所有的回话create的情况,这时候每次创建一个session就可以count+1 ,然后销毁的时候count-1 ,另外还需要一个ServletContext的监听器来监听web应用的生命周期,获取servletContext对象,然后将在线人员总数统计出来存放进去;

    具体代码如下:

    package com.facelook.util;

    import java.util.Map;

    import javax.servlet.ServletContext;

    import javax.servlet.ServletContextEvent;

    import javax.servlet.ServletContextListener;

    import javax.servlet.http.HttpSessionEvent;

    import javax.servlet.http.HttpSessionListener;

    import org.apache.log4j.Logger;

    import com.facelook.entity.User;

    public class SessionListener implements HttpSessionListener,ServletContextListener{

    private int count;

    private ServletContext servletContext = null;

    public SessionListener() {

    count = 0;

    }

    private Logger logger = Logger.getLogger(this.getClass());

    @Override

    public void sessionCreated(HttpSessionEvent event) {

    count++;

    setContext(event);

    logger.info("***************the http session is created...***************");

    }

    @Override

    public void sessionDestroyed(HttpSessionEvent event) {

    //在session销毁的时候 把loginUserMap中保存的键值对清除

    User user = (User)event.getSession().getAttribute("loginUser");

    if(user!=null){

    Map loginUserMap = (Map)event.getSession().getServletContext().getAttribute("loginUserMap");

    loginUserMap.remove(user.getFuUserName());

    event.getSession().getServletContext().setAttribute("loginUserMap",loginUserMap);

    }

    count--;

    setContext(event);

    logger.info("***************the http session is destroyed...***************");

    }

    public void setContext(HttpSessionEvent httpSessionEvent){

    httpSessionEvent.getSession().getServletContext().setAttribute("online", count);

    }

    @Override

    public void contextDestroyed(ServletContextEvent servletcontextevent) {

    this.servletContext = null;

    logger.info("***************the servlet context is destroyed...***************");

    }

    @Override

    public void contextInitialized(ServletContextEvent servletcontextevent) {

    this.servletContext = servletcontextevent.getServletContext();

    logger.info("***************the servlet context is initialized...***************");

    }

    }

    2、在UserAction中创建管理在线用户的模块的方法,并且支持强制退出的功能;

    /** * 退出登录

    * @return

    * @throws ServletException

    * @throws IOException

    */

    public String logout() throws ServletException, IOException{

    try {

    Map loginUserMap = (Map) super.getApplicationAttr(Constant.LOGIN_USER_MAP);

    User user = (User) super.getSessionAttr(Constant.LOGIN_USER);

    super.removeAttribute(Constant.LOGIN_USER_MAP);

    loginUserMap.remove(user.getFuUserName());

    super.setApplicationAttr(Constant.LOGIN_USER_MAP,loginUserMap);

    logger.info("退出登录成功!");

    } catch (Exception e) {

    e.printStackTrace();

    logger.error("退出登录失败: "+e.getMessage());

    }

    return INPUT;

    }

    /**

    * 在线用户管理

    * @return

    */

    public String loginManager(){

    return SUCCESS;

    }

    /**

    * 强制退出其他用户

    * @return

    */

    public String logoutOther(){

    try {

    String username = ServletActionContext.getRequest().getParameter("username");

    Map loginUserMap = (Map) super.getApplicationAttr(Constant.LOGIN_USER_MAP);

    if(username!=null && loginUserMap.containsKey(username)){

    loginUserMap.remove(username);

    super.setApplicationAttr(Constant.LOGIN_USER_MAP, loginUserMap);

    }

    } catch (Exception e) {

    e.printStackTrace();

    logger.info("强制退出失败: "+e.getMessage());

    }

    return null;

    }

    3、在管理页面加载在线用户的列表;

    对应的方法定义完毕之后,然后再在对应的管理页面添加在线列表,具体如下:

    欢迎来到Facelook

    登录列表

    Map map = (Map)application.getAttribute("loginUserMap");

    out.println("目前共有"+map.size()+"个用户在线!!");

    %>

    m : map.entrySet()){%>

    强制退出

    好了启动部署项目,然后启动服务,进入在线用户管理模块,简单效果如下图:

    b5d3a149103f84692aec5fa28fa47274.png

    需要注意的是:当前登录用户 不允许强制退出自己的登录信息。

    这样子,基本上可以实现防止多用户登录的案例了!

    以上所述是小编给大家介绍的Java Web开发防止多用户重复登录的完美解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

    时间: 2016-11-06

    展开全文
  • 前几天,网上找了些朋友的资料,做了一个小功能,验证用户是否重复登录。原理就是:每一个用户,登录前有一个验证,当第一次登录时,会把其session信息,添加到一个特定的静态变量中。当第二次登录时,验证到静态...

    前几天,网上找了些朋友的资料,做了一个小功能,验证用户是否重复登录。

    原理就是:每一个用户,登录前有一个验证,当第一次登录时,会把其session信息,添加到一个特定的静态变量中。当第二次登录时,验证到静态变量中存在该用户的信息,就表示为重复登录。

    jsp代码,一个form表单提交:

    method="post">

    用户名:

    密  码:

    struts2配置:

    /relogin.jsp

    /ok.jsp

    action代码:

    /*

    * 可判断用户是否重复登录

    */

    public String reLogin() {

    String userId = this.getTxtUser();//ServletActionContext.getRequest().getParameter("txtUser");

    UserInfo user = new UserInfo();

    user.setUserId(userId);

    //验证该用户ID,是否已经登录。当前用户比较已登录到系统的静态变量中的值,是否存在。

    Boolean hasLogin = SessionUserListener.checkIfHasLogin(user);

    // 如果重复登录,控制端则打印信息,返回登录页面

    if (hasLogin) {

    System.out.println(user.getUserId()+"已经登录到本系统。");

    return "input";

    // SessionUserListener.removeUserSession(userId);

    } else {

    // 如果没有重复登录,则将该登录的用户信息添加入session中

    ServletActionContext.getRequest().getSession().setAttribute("userInfo", user);

    // 比较保存所有用户session的静态变量中,是否含有当前session的键值映射,如果含有就删除

    if (SessionUserListener.containsKey(ServletActionContext.getRequest().getSession().getId())) {

    SessionUserListener.removeSession(ServletActionContext.getRequest().getSession().getId());

    }

    //把当前用户封装的session按,sessionID和session进行键值封装,添加到静态变量map中。

    SessionUserListener.addUserSession(ServletActionContext.getRequest().getSession());

    }

    return "success";

    }session监听类:

    package com.zyujie.listener;

    import java.util.ArrayList;

    import java.util.HashMap;

    import java.util.Iterator;

    import java.util.List;

    import java.util.Map;

    import javax.servlet.http.HttpSession;

    import javax.servlet.http.HttpSessionEvent;

    import javax.servlet.http.HttpSessionListener;

    import com.zyujie.pojo.UserInfo;

    public class SessionUserListener implements HttpSessionListener {

    // key为sessionId,value为HttpSession,使用static,定义静态变量,使之程序运行时,一直存在内存中。

    private static java.util.Map sessionMap = new java.util.concurrent.ConcurrentHashMap(500);

    /**

    * HttpSessionListener中的方法,在创建session

    */

    public void sessionCreated(HttpSessionEvent event) {

    // TODO Auto-generated method stub

    }

    /**

    * HttpSessionListener中的方法,回收session时,删除sessionMap中对应的session

    */

    public void sessionDestroyed(HttpSessionEvent event) {

    getSessionMap().remove(event.getSession().getId());

    }

    /**

    * 得到在线用户会话集合

    */

    public static List getUserSessions() {

    List list = new ArrayList();

    Iterator iterator = getSessionMapKeySetIt();

    while (iterator.hasNext()) {

    String key = iterator.next();

    HttpSession session = getSessionMap().get(key);

    list.add(session);

    }

    return list;

    }

    /**

    * 得到用户对应会话map,key为用户ID,value为会话ID

    */

    public static Map getUserSessionMap() {

    Map map = new HashMap();

    Iterator iter = getSessionMapKeySetIt();

    while (iter.hasNext()) {

    String sessionId = iter.next();

    HttpSession session = getSessionMap().get(sessionId);

    UserInfo user = (UserInfo) session.getAttribute("userInfo");

    if (user != null) {

    map.put(user.getUserId(), sessionId);

    }

    }

    return map;

    }

    /**

    * 移除用户Session

    */

    public synchronized static void removeUserSession(String userId) {

    Map userSessionMap = getUserSessionMap();

    if (userSessionMap.containsKey(userId)) {

    String sessionId = userSessionMap.get(userId);

    getSessionMap().get(sessionId).invalidate();

    getSessionMap().remove(sessionId);

    }

    }

    /**

    * 增加用户到session集合中

    */

    public static void addUserSession(HttpSession session) {

    getSessionMap().put(session.getId(), session);

    }

    /**

    * 移除一个session

    */

    public static void removeSession(String sessionID) {

    getSessionMap().remove(sessionID);

    }

    public static boolean containsKey(String key) {

    return getSessionMap().containsKey(key);

    }

    /**

    * 判断该用户是否已重复登录,使用

    * 同步方法,只允许一个线程进入,才好验证是否重复登录

    * @param user

    * @return

    */

    public synchronized static boolean checkIfHasLogin(UserInfo user) {

    Iterator iter = getSessionMapKeySetIt();

    while (iter.hasNext()) {

    String sessionId = iter.next();

    HttpSession session = getSessionMap().get(sessionId);

    UserInfo sessionuser = (UserInfo) session.getAttribute("userInfo");

    if (sessionuser != null) {

    if (sessionuser.getUserId().equals(user.getUserId())){

    return true;

    }

    }

    }

    return false;

    }

    /**

    * 获取在线的sessionMap

    */

    public static Map getSessionMap() {

    return sessionMap;

    }

    /**

    * 获取在线sessionMap中的SessionId

    */

    public static Iterator getSessionMapKeySetIt() {

    return getSessionMap().keySet().iterator();

    }

    }

    展开全文
  • 一:重复登录问题 随着互联网公司的项目在微服务和分布式的环境下进行的搭建, 导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题 当用户进行一个session会话的时候,比如一个用户去...

    一:重复登录问题

    随着互联网公司的项目在微服务和分布式的环境下进行的搭建,
    导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题
    
    当用户进行一个session会话的时候,比如一个用户去登录项目,
    一般的大公司的项目都是有Nginx进行反向代理的,
    但是这里简单列举一下Nginx常用的几种反向代理策略:1.轮询策略,2. 权重比例策略,3. ip_hash策略,
    4. 还可以自定义的策略,在Nginx的反向代理下,
    一般会把用户的请求分发到不同的服务器上,
    但是如果用户请求的请求是存放在该请求的服务器A上,
    那么该用户的sessionID就存储在该服务器上JVM的一个ConcurrentHashmap中,以sessionID为key。
    
    但是如果此时用户请求的一个服务模块可能需要调用到服务器B,
    当用户发起请求的时候,此时的服务器B上并没有存储该用户的sessionID,
    所以就会再次让用户进行一个登陆操作。还有可能会导致用户本来就想完成一个下单操作,
    但是却还登陆了好几次的情况。
    所以session共享方案在分布式环境和微服务系统下,显得尤其重要。
    

    方案一:基于Nginx(或其他负载的软件或硬件)的ip_hash 负载均衡

    其实就是对请求过来的ip地址对你的多少台可用的服务器进行取模,然后就会把你的请求通过Nginx的反向代理给分发到对应的服务器上。(这里会把可用的服务器放到一个数组中,如果取模得到的结果是几,就把请求分到服务器数组中的下标为几 的服务器上)

    需要你在Nginx.conf文件中进行对应的修改,根据自己的可用服务器
    upstream backend{
        ip_hash;
        server 192.168.128.1:8080 ;
        server 192.168.128.2:8080 ;
        server 192.168.128.3:8080 down;
        server 192.168.128.4:8080 down;
     
    }
    server {
        listen 8081;
        server_name test.csdn.net;
        root /home/system/test.csdn.net/test;
        location ^~ /Upload/upload {
        proxy_pass http://backend;
     
        }
    

    在这里插入图片描述

    在这里插入图片描述
    方案二:基于Tomcat的session复制
    这个解决方案其实就是当用户请求的时候,把产生的sessionID给复制到系统所有的服务器中,这样就能保证当用户请求的时候从服务器A可能调用到服务器B上的模块的时候,也能保证服务B也有该用户的sessionID,这样就不会再次让用户进行再次登录操作了。也就解决问题了。

    1、tomcat与redis集成实现session共享:
    环境为tomcat7 + jdk1.7或1.8的话:
    在所有需要共享session的服务器的tomcat中目录下:
    lib目录中添加以下三个jar包,测试通过:
    在这里插入图片描述

    conf目录中content.xml中加入:配置redis服务
    在这里插入图片描述

    2、如jkd1.8+tomcat7,在137和139两台tomcat中加入jar包且进行如上配置:
    在这里插入图片描述
    修改content.xml

    在这里插入图片描述
    在这里插入图片描述

    添加两个注意点
    1、按照如上配置,使用redis数据库,放入session中的对象必须要实现java.io.Serializable接口,使用memcache的可以不用实现Serializable接口
    原因是:因为tomcat里使用的将session放置redis使用的工具类,是使用的jdk序列化模式存储的,这一点也是很容易理解的,session.setAttribute(String key, Object value),存储Object类型
    object放入redis中又要能取出来,只能是序列化进行存储了,然后取出的时候进行反序列化。
    所以我们在session中存储的任何对象,都必须实现序列化接口。
    2、按照如上配置,使用redis做session存储空间时,web应用的session-time的时间单位会变成[秒],而不是原本的[分]
    原因是:因为tomcat里使用的将session放置redis使用的工具类,在存储时为对tomcat容器时间做转换
    在redis中设置过期时间是使用秒作为单位的,有个命令叫expire可以设置redis键值过期时间,所以在context.xml配置文件中我们需要制定session过期时间(默认是60秒,配成1800即30分钟),这一点很重要。
    请注意!!!!
    context.xml配置说明:
    在这里插入图片描述
    在这里插入图片描述

    方案三:使用Redis做缓存session的统一缓存
    每次用户的请求的时候生成的sessionID给放到Redis的服务器上。然后在基于Redis的特性进行设置一个失效时间的机制,这样就能保证用户在我们设置的Redis中的session失效时间内,都不需要进行再次登录。
    一:
    1、引入相关jar包:
    这里需要引入Spring Session和Spring Data Redis相关的依赖jar包。可以自行从maven仓库下载,也可以参考使用的jar包:down.51cto.com/data/228183…
    2、 修改spring-data-redis相关配置:
    在项目的spring-data-redis相关配置中添加相关配置
    3、修改web.xml:
    在web.xml中添加以下filter:springSessionRepositoryFilter
    org.springframework.web.filter.DelegatingFilterProxy
    4、这个filter放在第一位,其他的如编码、shiro等filter需要放在这之后
    到此,Spring Session和Spring Data Redis就整合到项目中了
    二: Spring Session 集群解决方案
    · HttpSession - 允许以应用程序容器(即 Tomcat)中性的方式替换 HttpSession。
    · 将 session 所保存的状态卸载到特定的外部 session 存储中,如 Redis 或 Apache Geode
    中,它们能够以独立于应用服务器的方式提供高质量的集群。
    · 支持每个浏览器上使用多个 session,从而能够很容易地构建更加丰富的终端用户体验。
    · 控制 session id 如何在客户端和服务器之间进行交换,这样的话就能很容易地编写 Restful API,因为它 · 可以从 HTTP头信息中获取 session id,而不必再依赖于 cookie。
    · 当用户使用 WebSocket 发送请求的时候,能够保持 HttpSession 处于活跃状态。
    用:spring-session-data-redis
    1、引入包

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    

    2、Session 配置

    @Configuration
    @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
    public class SessionConfig {
    }
    maxInactiveIntervalInSeconds: 设置 Session 失效时间,使用 Redis Session 之后,
    原 Boot 的 server.session.timeout 属性不再生效。
    

    3、实现模拟登陆
    添加登陆方法和注册方法:
    添加登录方法,登录成功后将用户信息存放到 Session 中。

    @RequestMapping(value = "/login")
    public String login (HttpServletRequest request,String userName,String password){
        String msg="登陆失败!";
        User user= userRepository.findByUserName(userName);
        if (user!=null && user.getPassword().equals(password)){
            request.getSession().setAttribute("user",user);
            msg="登陆成功!";
        }
        return msg;
    }
    

    定义 index 方法,只有用户登录之后才会看到:index content 这条信息否则提示请先登录。

    @RequestMapping(value = "/index")
    public String index (HttpServletRequest request){
        String msg="首页内容";
        Object user= request.getSession().getAttribute("user");
        if (user==null){
            msg="请先登录!";
        }
        return msg;
    }
    

    测试流程:
    访问:http://localhost:8800/index和http://localhost:8899/index都会提示先登录。
    用8800窗口登陆:localhost:8800/login?userName=xiaoli&password=123456。
    登陆成功后访问首页:显示首页内容,8899端口直接访问首页,我们发现显示首页内容,则实现了session共享。

    @RequestMapping(value = "/logout")
        public String logout (HttpServletRequest request){
            HttpSession session=request.getSession();
            session.removeAttribute("user");
            return "";
        }
    

    在这里插入图片描述

    方案四: 把session放到cookie中
    每次用户请求的时候,都会把自己的cookie放到请求中,所以这样就能保证每次用户请求的时候都能保证用户在分布式环境下,也不会在进行二次登陆。

    关于单点登录和SSO的思考

    1、单点登录和传统的区别,单点登录和免登陆的区别,单点登录和内嵌方式,及iframe等方式的使用区别,

    2、sso登录以后,可以将Cookie的域设置为顶域,即.a.com,这样所有子域的系统都可以访问到顶域的Cookie。我们在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域。比如:我们不能在自己的系统中给baidu.com的域设置Cookie。
    ----如果不在一个顶级域中???跨域还跨区,Nginx可以帮助拿到cookie中的信息,就是在A系统转发中把信息写到(B服务器端)的Nginx中,然后B服务从Nginx中获取cookie的信息做验证。

    展开全文
  • public class SessionListener implements HttpSessionListener , HttpSessionAttributeListener{ // 保存当前登录的所有用户 public static Map loginUser= new HashMap(); // 用这个作为session中的...
  • 目的:同一个用户不能重复登录。实现:在Action里做check,如果当前session里面有既存的user,就在登录页面上返回错误信息。现状:1.登录时提交方式为Post。2.登录用的actionForm已经在struts-config里面配置socpe=...
  • 登录成功后,使用用户id构造生成一个token并保存到redis中,同时也保存用户id到session中生成token的代码如下:@Overridepublic String createToken(String phone,String appId) throwsException {long loginTime =...
  • 这就是QQ限制了同一个号码在电脑上不能重复登录,我们的Web程序也可以进行重复登录的限制,那么本次任务就是用过滤器和监听器来解决重复登录问题。具体任务如下: 1、未登录时不能访问主界面。 2、登录后,登录...
  • 前一段时间碰到一个需求:一个账号只能登录一次,不能在网上找了下,大概有两种解决方案:1、通过数据库状态位判断该用户是否已经登录。2、利用session监听 器监听每一个登录用户的登录情况。个人想了下,第一种解决...
  • Redis实现防止重复登录和点赞的功能 久违地来更新一下项目。这次在之前的博客项目上加上了防止重复登录和文章的点赞功能。 Redis相关的代码写在一个新的provider中,模拟一个独立的服务器。同样将提供的服务注册在...
  • 因为shiro只是一个Java安全框架,并不会做重复登录的拦截,当一个用户登录成功后(chrome登录),再用另外一个浏览器登录(IE登录)或者另外一台电脑进行登录,两个都会登录成功,两个不同的session。 预期目的:不...
  • 正文: 有朋友在群里面提出一个很有意思的问题, 怎么跳过SAPGUI 登录时的重复登录提示,如下图 很快就有厉害的朋友给出了一个解决方案: 通过GUI脚本自动选择 脚本工具解决方案 海哥爱跑步,公众号:企业信息化思考用...
  • 我们后台项目是用Spring Security+JWT+OAuth2做的安全框架,现在有个需求就是同一账号重复登录时第一次登陆成功的强制下线。尝试了很多方法无果,当时真的是被弄得焦头烂额了。最后功夫不负有心人,最后找到了解决...
  • 问题 最近从别的项目组接来一个后台工程,安全框架使用的是spring security,运行起来后发现:项目刚运行启动时,登录一次即可成功登录并进入到主页,但当注销登录后回到登录页面,就需要重复登录两次才可进入系统。...
  • PHP,重复登陆
  • 待更新-心跳如何验证(多次心跳失败,才标记链路失效?我们目前的设计有问题)
  • 检测登录状态,防止重复登录 class Base extends Controller { protected function initialize() { parent::initialize(); // 继承父类初始化【防止子类重写】 define('USER_ID',Session::get('user_id')); } ...
  • 二 浏览器版本低于v90解决重复登录 1.将以下内容设置为禁用 三 浏览器版本v90及以上解决重复登录 1.将谷歌浏览器快捷图标复制到文件夹内,鼠标右键→属性→目标 --disable-features=SameSiteByDefaultCookies,...
  • php防止用户重复登录

    2020-12-22 12:41:03
    原标题:php防止用户重复登录先来理解一下session的几个设置:ini_set('session.auto_start',0);设置关闭session的自动启动ini_set('session.cookie_lifetime',0);设置session在浏览器关闭时失效,session默认情况下...
  • shiro多账户重复登录的问题探究最近研究shiro时,想探讨一下,多账户登录时,会不会顶下之前已经登录的账户,于是进行了以下测试:分析可能出现的结果:之后登录的账户会顶下之前登录的账户两次登录的账户会并存考虑...
  • publicclassaddusersextendsJPanel{publicaddusers(){//设置布局为nullthis.setLayout(null);jnumber=newJLabel("学号");number=newJTextField();jname=newJLabel("姓名");name=newJT...public class addusers ...
  • @解决Linux系统重复在用户登录界面循环的问题 解决Linux系统重复在用户登录界面循环的问题 网上有很多种原因,我遇到这种问题的原因是/home文件夹的内存空间不足,在登陆界面上会显示空间不足。 解决办法 开机时...
  • 最近换新电脑,部分系统,使用chorme用户登陆后,仍然不断提示用户未登录重复跳转登陆页面。 具体原因可参考这个文章,https://www.jianshu.com/p/6ae8b5259c82 解决方法:在Chrome中访问chrome://flags/,搜索...
  • 有个问题要记录一下,就是微信授权登录之后重复回调的问题。微信授权的流程是这样:1.用户在微信里打开链接A,微信就会携带code和state访问A中的重定向链接B。(用户的微信客户端-->微信)链接A如下:...
  • 问题一: 模拟登陆后进行测试 先到进行登录的位置,如可以设置到test_01_xx.py 或者 conftest.py 当做前置执行,将登陆之后的状态存储起来。 storage = context.storage_state() os.environ["STORAGE"] = json....
  • 还有一个提交业务数据的接口B(就是为了防止这个接口B,重复操作提交); (2)、在进入需要提交页面时,调用后台接口A,例如获取token = 123,并且返回给前端token (3)、前端点击提交按钮时,只调用提交接口B...
  • xiaomin重复,根据版本app_version去重,去版本大的 C# List集合去除重复数据 实例如下: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; ... mysql数据库去除...
  • 想像在Windows中那样在终端中直接启动adb,以为Linux和Windows一样,将adb的路径添加到环境变量中,于是将adb的路径也export到/etc/profile中,可杯具了,重启系统后,无限循环登录界面,经多方查找资料找到了解决...
  • 同一账号只能在一台设备登录实现思路。 注意:登录是在白名单(直接放行的接口)。... ... ...如果不一致,则告诉前端重复登录,让前端清除token,跳转到登录页面。 3.用户在另一台设备登录时,也是存入redis,这
  • 文章目录前言基于ruoyi管理框架,前后端分离版做的修改,大致思路在我上一篇博客中有,这里直接讲具体实现一、用户结构二、修改登录接口,在登陆的同时随机生成新版本号,用户id加前缀当做key存入redis当中这一步做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 288,137
精华内容 115,254
关键字:

重复登录