찾다

 >  Q&A  >  본문

Laravel에서는 액세스된 경로에 따라 세션 시간을 동적으로 연장할 수 있습니까?

<p>제목이 내 문제를 거의 요약하고 있습니다. </p> <p>제가 근무하는 회사에는 <code>config/session.php</code>의 세션 시간이 기본 동작인 <strong>120분</strong> 후에 만료되도록 설정된 Laravel 애플리케이션이 있습니다. 우리는 이 값을 변경하고 싶지 않습니다. </p> <p>그러나 시스템에는 사용자가 많은 수의 양식/설문지에 응답해야 하는 특정 기능이 있습니다.<strong>사용자가 입력하는 속도가 느린 경우 완료하는 데 3~4시간 이상이 걸릴 수 있습니다</ 강함>제출하기 전에 돌아가기 몇 가지 답변을 다시 생각해 보세요. </p> <p>문제는 일부 사용자가 여전히 모든 질문을 완료하지 않았으며 세션 만료로 인해 진행 상황이 사라지고 때로는 몇 분 후에야 "다음 페이지"로 전환했다는 사실을 알게 된다는 것입니다. 질문. 이미 채워진 데이터를 저장하는 것을 고려했지만 AJAX 호출로 콘텐츠를 유지하고 이미 채워진 부분을 데이터베이스에 저장하더라도 양식에 응답할 때 다시 로그인해야 하는 것은 여전히 ​​나쁜 사용자 경험이 될 것입니다. 어쨌든 이를 따라야 하며 양식 페이지에 다시 링크해야 합니다. 세션 만료로 인해 고객으로부터 많은 불만이 접수되었습니다. </p> <p>가장 좋은 해결책은 <code>FormController.php</code>에 일종의 기능을 생성하는 것입니다. 사용자가 양식 페이지나 다른 특정 경로에 들어가면 <code>session과 같은 것을 실행합니다. () 작업 ->extendSessionInMinutes(360). 몇 가지 조사를 했지만 Laravel 문서(<code>Laravel 8.1</code>를 사용하고 있음에 유의하세요) 또는 Stackoverflow에서 비슷한 내용을 찾을 수 없습니다. 사용자 역할 등에 따라 다양한 세션 수명주기를 제공하는 새로운 미들웨어를 만드는 방법에 대한 솔루션과 같이 이번 주에 이 주제에 대해 많이 읽었지만 이 옵션은 우리에게는 작동하지 않았습니다. </p> <p>저는 유사한 솔루션을 사용하여 <strong>새 변수</strong> <code>session()->put('time_to_logout' , now()-를 추가하는 솔루션을 개발 중입니다. >addHours( 2))</code> 세션이 언제 2시간에 도달하는지 정확히 알 수 있도록<strong><code>SESSION_LIFETIME</code></strong> 값을 5시간으로 설정하고 로그아웃이 필요한지 30분마다 확인하고 사용자를 로그아웃 페이지로 리디렉션하는 JS 기능을 추가합니다. 사용자가 양식 페이지에 있으면 확인을 중지합니다. </p> <p>하지만 이것이 사실 좋은 해결책은 아닌 것 같은데, 다른 해결책은 생각나지 않는 것 같습니다.어떤 식으로든 세션 시간을 연장하여 내가 원하는 것을 달성할 수 있는 방법이 있나요? 또는 사용자에게 영향을 주지 않고 세션을 다시 생성하고(이렇게 하면 양식의 CSRF 토큰이 엉망이 될 것이라고 장담합니다) 사용자가 계속해서 양식을 작성하는 동안 2시간 동안 기다리지 않고 세션을 원활하게 다시 생성합니다. 어떤 변화가 느껴지나요? </p> <p>한번 세션이 생성되면 만료 시간을 변경할 수 없나요? Laravel의 기본 세션 관련 기능을 너무 많이 변경하지 않고도 나를 도울 수 있는 일종의 PHP 라이브러리가 있습니까? </p> <p><em>의견을 보내주셔서 미리 감사드립니다. </em></p>
P粉019353247P粉019353247452일 전623

모든 응답(1)나는 대답할 것이다

  • P粉978551081

    P粉9785510812023-09-02 00:13:22

    예, 가능합니다. 그리고 다음을 수행해야 합니다 -

    1. 세션 수명주기의 동적 변경은 미들웨어를 통해서만 가능합니다. 컨트롤러 (미들웨어 없음)를 통해 변경하면 세션이 이미 시작되었으므로 세션 값 이 변경되지 않습니다. 그래서 미들웨어가 필요합니다. 바로 이렇습니다-
    으아악
    1. 그 후, app/Http/Kernel.php 파일의 $middlewarePriority 배열에 미들웨어를 추가해야 합니다. 이는 Laravel이 자체 "StartSession" 미들웨어를 실행하기 전에 실행되어야 합니다. 바로 이렇습니다-

    IlluminateSessionMiddlewareStartSession::class, 之前添加 AppHttpMiddlewareChangeSessionValueDynamically::class,.

    으아악
    1. 아래와 같이 AppHttpMiddlewareChangeSessionValueDynamically::class에 대한 별칭을 제공하세요. -
    으아악
    1. 아래 표시된 대로 경로에 이 미들웨어를 포함하세요. -
    으아악

    회신하다
    0
  • 취소회신하다