基本思路是:
1、登录的时候设置session和cookie还有一个静态变量用来存储生成的sessionId的值;
2、由于session的生命周期在关掉浏览器的时候也over了,所以我们需要使用cookie来存取sessionId的值,然后给静态变量map中设值,以便后期的查询
3、过滤器中需要获取指定的cookie的值来获取sessionId,然后根据sessionId来获取静态变量中的信息,然后在存入session中。
代码如下所示:
登录后台代码:
@Controller
@RequestMapping("site")
public class SiteIndexController extends PressyunController {
@Inject
private DnaUserService dnaUserService;
public static Map<String, DnaUser> sessionUsermap = new HashMap<>();
@LogOperationRequired(value = "登陆")
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestParam("username") String username, @RequestParam("password") String password,HttpServletRequest request, HttpServletResponse response, Map<String, Object> viewData)throws UnsupportedEncodingException {
Map<String, Object> map = new HashMap<String, Object>();
DnaUser dnaUser = dnaUserService.getUserByLogin(username, password);
dnaUser.setPassword(null);
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
request.getSession().setAttribute("dnaUser", dnaUser);
session.setMaxInactiveInterval(3600 * 24 * 10);// 10天
Cookie sessionIdCookie = new Cookie("dnasessionId", session.getId());//给页面设置sessionId
sessionIdCookie.setMaxAge(60 * 60 * 24 * 10);
sessionIdCookie.setPath("/");
response.addCookie(sessionIdCookie);
sessionUsermap.put(session.getId(), dnaUser);//给静态变量添加值
return "redirect:index";
}
}
拦截器后台代码:如果有找到sessionid的值且在静态变量中也有值,则该用户可以直接登录,在session中设值即可
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Resource
private DnaUserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return login(request);//在进入controller层之前会先执行这里
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
private boolean login(HttpServletRequest request) {
//获取本地的cookies
String sessionIdStr = "";
Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (Cookie cookie : cookies) {
if ("dnasessionId".equals(cookie.getName())) {
sessionIdStr = cookie.getValue();
}
}
}
DnaUser loginUser = SiteIndexController.sessionUsermap.get(sessionIdStr);//根据session在静态变量中取值
if (loginUser != null) {
HttpSession session = request.getSession();
request.getSession().setAttribute(Constant.SITE_USER, loginUser);//取完值在给session设置
session.setMaxInactiveInterval(3600 * 24 * 10);// 10天
}
return true;
}
}
首页jsp代码:如果session中没有值则跳到登录界面
<%@page import="com.ppress.example.po.DnaUser"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<link rel="stylesheet" type="text/css" href="content/site/common/css/component.css"/>
<link rel="stylesheet" type="text/css" href="content/site/common/css/index.css?v=201803151600"/>
<script src="content/site/common/js/common/modernizr.custom.js"></script>
<script src="content/site/common/js/common/jquery.dlmenu.js"></script>
<%
DnaUser dnaUser = null;
String userName = null;
if(session.getAttribute("dnaUser") != null){
dnaUser = (DnaUser)session.getAttribute("dnaUser");
userName = dnaUser.getAccount();
}
%>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
<a href="/" class="logo"><img src="/content/site/common/images/system/logo.png" width="40" height="40">XX平台</a>
<div class="top-menu visible-desktop">
<ul class="pull-right">
<li><a href="javascript:;">
<%
if("admin".equals(userName)){
%>
${dnaUser.account}(管理员)
<%
}else{
%>
${dnaUser.account}(用户)
<%
}
%>
</a></li>
<li><a href="/site/logout"><i class="icon-off"></i> 退出</a></li>
</ul>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
<%
if(request.getAttribute("dnaUser")==null){
%>
location.href = "/site/login";
<%
}
%>
});
</script>
登出后台操作:
@RequestMapping(value = "/logout")
public String logout(HttpServletRequest request, HttpServletResponse response, Map<String, Object> viewData) {
request.getSession().invalidate();
String sessionIdStr = "";
Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (Cookie cookie : cookies) {
if ("dnasessionId".equals(cookie.getName())) {
sessionIdStr = cookie.getValue();
sessionUsermap.remove(sessionIdStr);//移除静态变量中的值
}
}
}
Cookie deleteNewCookie = new Cookie("dnasessionId", null);
deleteNewCookie.setMaxAge(0); // 删除该Cookie
deleteNewCookie.setPath("/");
response.addCookie(deleteNewCookie);
return "redirect:login";
}