宝塔用户_asbmxj 发表于 2023-8-16 19:27:34

【已解答】springboot项目里面有个登录拦截器,我使用nginx...

为了能快速了解并处理您的问题,请提供以下基础信息:面板、插件版本:
系统版本:
问题描述:springboot项目里面有个登录拦截器,我使用nginx的负载均衡,切换端口会出错我该怎么解决这个问题
相关截图(日志、错误):
nginx文件:
worker_processes auto;
worker_rlimit_nofile 51200;
events
{
      worker_connections 51200;
      multi_accept on;
}
http {
                include       mime.types;
                #include luawaf.conf;
                include proxy.conf;
      default_typeapplication/octet-stream;

      server_names_hash_bucket_size 512;
      client_header_buffer_size 32k;
      large_client_header_buffers 4 32k;
      client_max_body_size 50m;

      sendfile   on;
      tcp_nopush on;

      keepalive_timeout 60;

      tcp_nodelay on;

      fastcgi_connect_timeout 300;
      fastcgi_send_timeout 300;
      fastcgi_read_timeout 300;
      fastcgi_buffer_size 64k;
      fastcgi_buffers 4 64k;
      fastcgi_busy_buffers_size 128k;
      fastcgi_temp_file_write_size 256k;
                fastcgi_intercept_errors on;

      gzip on;
      gzip_min_length1k;
      gzip_buffers   4 16k;
      gzip_http_version 1.1;
      gzip_comp_level 2;
      gzip_types   text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
      gzip_vary on;
      gzip_proxied   expired no-cache no-store private auth;
      gzip_disable   "MSIE \.";

      limit_conn_zone $binary_remote_addr zone=perip:10m;
                limit_conn_zone $server_name zone=perserver:10m;

      server_tokens off;
      access_log off;

   upstream blog{

      server localhost:8081 ;
      server localhost:8082 ;
}
    server {
      listen       8080;
      server_namelocalhost;

      #charset koi8-r;

      #access_loglogs/host.access.logmain;

      location / {
      proxy_pass http://blog;
            root   html;
            indexindex.html index.htm;
      }
                location /nginx_status {
                allow 127.0.0.1;
            deny all;
            stub_status on;
            access_logoff;
      }
    }
    include vhost/*.conf;
    #加载vhost目录下的虚拟主机配置文件
}
拦截器:
package com.cyx.cyxdeboke.interceptor;

import com.cyx.cyxdeboke.Entity.Admin;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//拦截器
@Component
public class AdminLoginInterceptor implements HandlerInterceptor {
    /***
   * 在请求处理之前进行调用(Controller方法调用之前)
   */
@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      System.out.println("执行了拦截器的preHandle方法");
      
      try {
            HttpSession session = request.getSession();
            //统一拦截(查询当前session是否存在admin)(这里admin会在每次登录成功后,写入session)
Admin admin = (Admin) session.getAttribute("admin");
            if (admin != null) {
                return true;
            }
            response.sendRedirect(request.getContextPath() + "index");
      } catch (Exception e) {
            e.printStackTrace();
      }
      return true;
      //如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
//如果设置为true时,请求将会继续执行后面的操作
}

    /***
   * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      System.out.println("执行了拦截器的postHandle方法");
    }

    /***
   * 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
*/
@Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      System.out.println("执行了拦截器的afterCompletion方法");
    }
}


谢花郎 发表于 2023-8-17 09:25:53

您好,您那边调整下您负载均衡的设置,调整使用ip_hash策略。它会根据客户端IP地址将相同IP的请求定向到同一台后端服务器,这样就能避免登录状态在不同服务器之间的切换问题。当用户登录后,会话信息保存在后端服务器上,如果后续请求切换到了另一台服务器上,可能会导致会话丢失或登录状态无效。
页: [1]
查看完整版本: 【已解答】springboot项目里面有个登录拦截器,我使用nginx...