代码下载:login_limit
1、需求场景
1)分享到其它平台链接用户点击跳转相应平台登录页面,登录后重定向到分享页面
2)用户停留在某页面长时间未操作至session过期,刷新或点击其他链接重定向到登录页面,登录后要求重定向到要访问页面
2、需求分析
考虑到登录后要重定向到某个页面,所以在跳转登录页面的时候需要系统存储当前链接,以便在登录后重定向。思路已经非常清晰,由于我们使用拦截器进行用户是否登录判断,因此只需在拦截器的方法里对当前链接进行保存,然后登录重定向即可。具体代码如下:
由于之前已写过多用户登录限制,因此我们只需在这篇博文的基础上稍作修改即可(具体只需修改登录拦截器即可),修改后代码如下(粗体字代码为修改代码)
注:需要注意的是异步请求需被过滤(异步请求不会跳转页面,导致登录后页面直接显示请求数据)
package com.utils.interceptor;
import com.entity.User;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 登录拦截器 1、未登录跳转登录页面 2、掉线保存当前链接,重定向到登录页面,登录后重定向到要访问页面 3、用户被踢掉后给出提示信息
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("now_user");
//用户掉线或被挤掉,保存当前链接并重定向到登录页面
if (request.getHeader("x-requested-with") == null) {//非ajax(异步)请求,则保存当前访问链接
String queryUrl = request.getQueryString() == null ? "" : ("?" + request.getQueryString());//获取参数
String requestUrl = request.getServletPath() + queryUrl;//httpRequest.getServletPath(),获取链接
if (session.getAttribute("redirect_link") == null) {
session.setAttribute("redirect_link", requestUrl);
}
}
if (user == null) {
response.sendRedirect(request.getContextPath() + "/other/toLogin");
return false;
}
//多用户登录限制判断,并给出提示信息
boolean isLogin = false;
if (user != null) {
Map<String, String> loginUserMap = (Map<String, String>) session.getServletContext().getAttribute("loginUserMap");
String sessionId = session.getId();
for (String key : loginUserMap.keySet()) {
//用户已在另一处登录
if (key.equals(user.getUserName()) && !loginUserMap.containsValue(sessionId)) {
isLogin = true;
break;
}
}
}
if (isLogin) {
Map<String, String> loginOutTime = (Map<String, String>) session.getServletContext().getAttribute("loginOutTime");
session.setAttribute("mess", "用户:" + user.getUserName() + ",于 " + loginOutTime.get(user.getUserName()) + " 已在别处登录!");
loginOutTime.remove(user.getUserName());
session.getServletContext().setAttribute("loginUserMap", loginOutTime);
response.sendRedirect(request.getContextPath() + "/other/toLogin");
return false;
}
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}
到此,用户登录后重定向到要访问页面的问题完美解决。
来源:https://www.cnblogs.com/sunjf/p/springmvc_login.html