이 글에서는 주로 Javaweb 프로젝트용 세션 타임아웃 솔루션을 소개하고 있으며, 솔루션 분류가 비교적 명확하고 내용이 자세하게 나와 있어 도움이 필요한 친구들이 참고할 수 있습니다.
Java 웹 개발에서 세션은 브라우저와 서버 사이에서 유지 관리되므로 많은 편의성을 제공합니다. 세션 시간 초과는 다음과 같이 이해됩니다. 클라이언트가 오랫동안(휴면 시간) 서버와 상호 작용하지 않으므로 클라이언트가 서버와 다시 상호 작용할 때 서버는 이 세션을 삭제합니다. 이전 세션이 존재하지 않습니다.
0. 요구 사항
모든 /web/** 요청에 대한 로그인을 차단하고 세션 시간이 초과되면 로그인 페이지로 이동해야 합니다.
1. 소개
일반적으로 세션 시간 제한은 프로젝트 사용 중에 구성됩니다. 구성하지 않으면 기본값은 30분입니다. 즉, 30분 동안 사용자가 작동하지 않으면 세션이 종료됩니다. 만료됩니다. 사용자는 시스템에 다시 로그인해야 합니다.
세션 시간 초과 구성은 주로 웹에서 구성됩니다. 즉, 뷰와 모델을 반환하는 요청을 시작하고, 다른 하나는 주로 모델 데이터를 반환하는 Ajax 요청입니다. 백엔드가 처리를 수행할 때 다양한 요청에 따라 다른 콘텐츠를 반환해야 합니다.
일반적인 요청의 경우 JavaScript 스크립트를 직접 반환합니다. 스크립트의 내용은 로그인 페이지로 이동하는 것입니다.
Ajax 요청의 경우 200이 아닌 상태 코드를 반환해야 ajax 요청이 오류 콜백 함수와 전역 Ajax 오류 콜백 함수 AjaxError를 입력할 수 있습니다.
3. 백엔드는 세션 시간 초과를 처리합니다
백엔드는 이를 처리하기 위해 SpringMVC의 인터셉터를 사용합니다. 한편으로 요청 URL은 /*와 같이 너무 제한적일 수 없습니다. 모든 요청을 필터링하는 것은 리소스 낭비입니다. 반면, 일부 URL은 가로챌 필요가 없습니다. 예를 들어 로그인 페이지에 대한 요청을 가로채면 안 됩니다. 그렇지 않으면 루프에서 리디렉션됩니다. 반면에 컨트롤러 요청만 가로채면 되고 다른 요청은 가로채면 안 됩니다.
인셉터의 구현을 살펴보겠습니다.
<span style="font-size: 14px;"> <!-- 设置Session超时时间 --> <session-config> <!-- 分钟 --> <session-timeout>60</session-timeout> <!-- 去除URL上显示的jsessionid, 防止打开Tab页时出现JS错误 --> <tracking-mode>COOKIE</tracking-mode> </session-config></span><span style="font-size:24px;"> </span>
인셉터는 SpringMVC 구성 파일에서 다음과 같이 구성됩니다.
/** * Web端登录拦截器 * 处理请求时Session失效的问题,包含Ajax请求和普通请求 * @ClassName WebLoginInterceptor * @author zhangshun * @date 2016年10月20日 上午11:14:52 */ public class WebLoginInterceptor extends HandlerInterceptorAdapter{ /** * 日志对象 */ private Logger logger = LoggerFactory.getLogger(WebLoginInterceptor.class); /** * 默认注销URL * 即Session超时后,发起请求到此地址,只对普通请求有效 */ private static final String DEFAULT_LOGOUT_URL = "/web/logout"; /** * 注销URL */ private String logoutUrl; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { User user = SessionUtils.getUserFromRequestAcrossCas(request); String uri = request.getRequestURI(); if(user == null){ response.setContentType("text/html;charset=UTF-8"); if(request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ // Ajax请求, 前段根据此header进行处理 response.setHeader("sessionTimeout", "Session time out, you need relogin !"); // 返回未认证的状态码(401) response.setStatus(HttpStatus.UNAUTHORIZED.value()); logger.debug("请求路径:" + uri + ", 请求方式 :Ajax请求, Session超时, 需要重新登录!"); }else{ // 普通请求 String path = request.getContextPath(); StringBuffer basePath = new StringBuffer() .append(request.getScheme()) .append("://") .append(request.getServerName()) .append(":") .append(request.getServerPort()) .append(path) .append("/"); StringBuffer responseStr = new StringBuffer() .append("<html><header><script type=\"text/javascript\">") .append("window.location.href=\"") .append(basePath).append(getLogoutUrl()).append("\";") .append("</script></header></html>"); response.getWriter().write(responseStr.toString()); logger.debug("请求路径:" + uri + ",请求方式 :普通请求, Session超时, 需要重新登录!"); } return false; } return true; } public String getLogoutUrl() { // 使用默认值 if(StringUtils.isEmpty(logoutUrl)){ return DEFAULT_LOGOUT_URL; } return logoutUrl; } public void setLogoutUrl(String logoutUrl) { this }
일반적인 요청의 경우 백엔드는 즉시 실행되는 JavaScript 스크립트를 반환합니다. . 여기 프론트엔드가 있습니다. 처리가 필요하지 않습니다.
Ajax 요청의 경우 백엔드는 401 상태 코드와 헤더에 설정된 sessionTimeout을 반환합니다. 여기서는 jQuery의 ajaxComplete 콜백 함수가 다음과 같이 사용됩니다.
<span style="font-size:14px;"><!-- MVC拦截器 --> <mvc:interceptors> <!-- Web登录拦截器 --> <mvc:interceptor> <mvc:mapping path="/web/**"/> <mvc:exclude-mapping path="/web/index"/><!-- 防止循环重定向到首页 --> <mvc:exclude-mapping path="/web/login"/> <mvc:exclude-mapping path="/web/logout"/> <mvc:exclude-mapping path="/web/doLogin"/> <bean class="com.woyi.mhub.interceptor.WebLoginInterceptor"/> </mvc:interceptor> </mvc:interceptors></span><span style="font-size:24px;"> </span>자, 세션 시간이 초과된 사용자가 처리됩니다.
위 내용은 Javaweb 프로젝트의 세션 시간 초과 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!