복붙노트

[SPRING] Spring 보안을 사용하여 세션 시간 초과 메시지를 얻는 방법

SPRING

Spring 보안을 사용하여 세션 시간 초과 메시지를 얻는 방법

세션이 만료 될 때 세션 시간 초과 메시지를 가져오고 싶습니다. 아래는 my spring-security.xml입니다.

<http auto-config="true" use-expressions="true">
    <logout logout-success-url="/" invalidate-session="true" logout-url="/LogOut"/>
    <form-login login-page="/Login" username-parameter="Name" password-parameter="Pwd"/>
    <session-management invalid-session-url="/?timeout=true">
        <concurrency-control max-sessions="1" expired-url="/Timeout?timeout=true" />
    </session-management>
</http>

내 지식에 따르면 세션이 만료되었을 때 위의 코드를 사용하면 /? timeout = true 또는 / Timeout? timeout = true로 리디렉션되어야합니다. 로그 아웃 할 때 /에 가야합니다. 하지만 내 경우에는 로그 아웃시에도 invalid-session-url로 리디렉션되므로 정상적인 로그 아웃과 세션 타임 아웃에 대해 항상 타임 아웃이 발생합니다.

이것을 차별화하도록 도와주세요.

최신 정보

/ 로그 아웃 요청에 포함 된

session = request.getSession();
session.invalidate();
session = null;

해결법

  1. ==============================

    1.나는 그것을 해결했다! 스프링 보안 (Spring Security)에 의존하는 대신 필터를 작성한다.

    나는 그것을 해결했다! 스프링 보안 (Spring Security)에 의존하는 대신 필터를 작성한다.

    관심있는 사람이 있으면 아래 코드를 사용할 수 있습니다.

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.text.MessageFormat;
    
    import javax.servlet.FilterChain;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    public class FilterToGetTimeOut extends OncePerRequestFilter {
    
        @Override
        public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException {
            try {
                if(request.getRequestURI().equals("/") || request.getRequestURI().equals("/Login/")){
                    if(request.getSession().getAttribute("login") != null && (Boolean)request.getSession().getAttribute("login") == true){
                        response.sendRedirect(URL);     //After login page
                    }
                } else if(request.getSession().getAttribute("login") == null && !request.getRequestURI().equals("/LogOut")){
                    response.sendRedirect(request.getContextPath()+"/?timeout=true");   //If timeout is true send session timeout error message to JSP
                }
                filterChain.doFilter(request, response);
            } catch (Exception e) {
                //Log Exception
    
            }
        }
    }
    

    이 필터를 web.xml에 추가하십시오.

        <filter>
            <filter-name>FilterToGetTimeOut </filter-name> 
            <filter-class>package.FilterToGetTimeOut </filter-class> 
        </filter>
        <filter-mapping> 
            <filter-name>FilterToGetTimeOut</filter-name> 
            <url-pattern>/*</url-pattern> 
        </filter-mapping> 
    

    이제 세션도 무효화되고 세션 시간 초과도 처리 할 수 ​​있습니다.

  2. ==============================

    2.다음을 사용하여 로그 아웃하시기 바랍니다.

    다음을 사용하여 로그 아웃하시기 바랍니다.

    HttpSession session= request.getSession(false);
        SecurityContextHolder.clearContext();
            if(session != null) {
                session.invalidate();
            }
            for(Cookie cookie : request.getCookies()) {
                cookie.setMaxAge(0);
            }
    
  3. ==============================

    3.어떤 경우에 발생하는 것은 사용자가 로그 아웃 할 때 세션이 처음 무효화 된 다음 세션 관리가 트리거를 얻을 때입니다. 세션 관리가 들어 와서 세션이 이미 사라진 것을 알게되면 sessionTimeout 페이지가 리디렉션됩니다. 따라서 로그 아웃 태그의 invalidate-session을 false로 설정하는 것이 좋습니다.

    어떤 경우에 발생하는 것은 사용자가 로그 아웃 할 때 세션이 처음 무효화 된 다음 세션 관리가 트리거를 얻을 때입니다. 세션 관리가 들어 와서 세션이 이미 사라진 것을 알게되면 sessionTimeout 페이지가 리디렉션됩니다. 따라서 로그 아웃 태그의 invalidate-session을 false로 설정하는 것이 좋습니다.

    <logout logout-success-url="/" invalidate-session="false" logout-url="/LogOut"/>
    
  4. ==============================

    4.logout-success url에 대한 요청 매핑을 컨트롤러에서 정의하고 거기에서 홈 페이지로 리디렉션하십시오. 예를 들어 아래와 같이 매핑을 바꿉니다.

    logout-success url에 대한 요청 매핑을 컨트롤러에서 정의하고 거기에서 홈 페이지로 리디렉션하십시오. 예를 들어 아래와 같이 매핑을 바꿉니다.

    <http auto-config="true" use-expressions="true">
    <logout logout-success-url="/logoutSucess" invalidate-session="true" logout-url="/LogOut"/>
    <form-login login-page="/Login" username-parameter="Name" password-parameter="Pwd"/>
    <session-management invalid-session-url="/?timeout=true">
        <concurrency-control max-sessions="1" expired-url="/Timeout?timeout=true" />
    </session-management>
    

    @RequestMapping (value = "/ logoutSucess"method = RequestMethod.GET)을 사용하여이 / logoutSucess를 컨트롤러에 정의하십시오.

  5. ==============================

    5.비슷한 문제가있어.

    비슷한 문제가있어.

    내 봄 보안 파일에있는 코드는 다음과 같습니다.

    <session-management invalid-session-url="/?timeout=true">
    <concurrency-control max-sessions="1" expired-url="/logout?timeout" />
    

    web.xml 파일에 세션 시간 초과 항목을 추가하여이 문제를 해결했습니다. 세션 시간 초과 값을 5 분으로 설정하고 응용 프로그램을 빌드하고 배포합니다. 잘 작동합니다.

    누군가가 도움이 될지도 모릅니다.

    감사, 아툴

  6. from https://stackoverflow.com/questions/36708580/how-to-get-session-time-out-message-using-spring-security by cc-by-sa and MIT license