[SPRING] Spring 보안을 사용하여 세션 시간 초과 메시지를 얻는 방법
SPRINGSpring 보안을 사용하여 세션 시간 초과 메시지를 얻는 방법
세션이 만료 될 때 세션 시간 초과 메시지를 가져오고 싶습니다. 아래는 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.나는 그것을 해결했다! 스프링 보안 (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.다음을 사용하여 로그 아웃하시기 바랍니다.
다음을 사용하여 로그 아웃하시기 바랍니다.
HttpSession session= request.getSession(false); SecurityContextHolder.clearContext(); if(session != null) { session.invalidate(); } for(Cookie cookie : request.getCookies()) { cookie.setMaxAge(0); }
-
==============================
3.어떤 경우에 발생하는 것은 사용자가 로그 아웃 할 때 세션이 처음 무효화 된 다음 세션 관리가 트리거를 얻을 때입니다. 세션 관리가 들어 와서 세션이 이미 사라진 것을 알게되면 sessionTimeout 페이지가 리디렉션됩니다. 따라서 로그 아웃 태그의 invalidate-session을 false로 설정하는 것이 좋습니다.
어떤 경우에 발생하는 것은 사용자가 로그 아웃 할 때 세션이 처음 무효화 된 다음 세션 관리가 트리거를 얻을 때입니다. 세션 관리가 들어 와서 세션이 이미 사라진 것을 알게되면 sessionTimeout 페이지가 리디렉션됩니다. 따라서 로그 아웃 태그의 invalidate-session을 false로 설정하는 것이 좋습니다.
<logout logout-success-url="/" invalidate-session="false" logout-url="/LogOut"/>
-
==============================
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.비슷한 문제가있어.
비슷한 문제가있어.
내 봄 보안 파일에있는 코드는 다음과 같습니다.
<session-management invalid-session-url="/?timeout=true"> <concurrency-control max-sessions="1" expired-url="/logout?timeout" />
web.xml 파일에 세션 시간 초과 항목을 추가하여이 문제를 해결했습니다. 세션 시간 초과 값을 5 분으로 설정하고 응용 프로그램을 빌드하고 배포합니다. 잘 작동합니다.
누군가가 도움이 될지도 모릅니다.
감사, 아툴
from https://stackoverflow.com/questions/36708580/how-to-get-session-time-out-message-using-spring-security by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] <form : select>에서 데이터를 전달하는 방법 Spring MVC (0) | 2019.01.21 |
---|---|
[SPRING] @NamedQuery가 Spring 데이터 나머지에서 findAll을 오버라이드합니다. JpaRepository (0) | 2019.01.21 |
[SPRING] Spring Controller에서 web.xml의 <context-param> 값에 접근하는 방법 (0) | 2019.01.21 |
[SPRING] 선언적인 트랜잭션 (@Transactional)은 Spring의 @Repository와 작동하지 않습니다. (0) | 2019.01.21 |
[SPRING] 여러 포트에서 봄 부팅 2.0 듣기 (0) | 2019.01.21 |