java拦截器+cookie+session 实现N天免登陆

基本思路是:

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";
	}

 

转载于:https://my.oschina.net/zrz1992/blog/1788432

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值