现在的电商网站,对登陆的要求不一致,有的是不登录不能浏览商品;有的不登录可以浏览商品,而且也能放入购物车,在结算时才使用拦截器使其登录。
登录的逻辑其实并不复杂,后来自己想想,还是总结一下:
首先网站header中的登录入口,跳转到登录页面login.jsp,此链接使用get方式提交,并把returnulr(使用window.location.href可以获取到)作为url的参数,提交到登录页面login.jsp,
<script type="text/javascript">
//登陆
function login(){
window.location.href = "/user/login.jsp?returnurl="+window.location.href;
}
</script>
页面header中登录入口如下:
<li class="dev"><a href="javascript:void(0)" οnclick="login()" title="登陆">[登陆]</a></li>后端controller层可以根据url只做一次跳转
//GET
@RequestMapping(value = "/user/login.jsp",method=RequestMethod.GET)
public String login(){//这里没有使用参数来接收url传递过来的returnurl,因为下面login.jsp中的隐藏域获取提交。
return "user/login";
}
login.jsp中如下配置:
<form id="jvForm" action="user/profile.jsp" method="post">
<input type="hidden" name="returnUrl" value="${param.directUrl}"/> //这个配置就可以把url中的参数returnurl获取到?,实验结果是可以的,记住就行。
。。。省略。。。。</from>
这样当在login.jsp中点击登陆按钮,就可以把returnurl传递给后端如下代码
@RequestMapping(value = "/user/login.jsp",method=RequestMethod.POST)
public String login(User user,String captcha,String returnUrl,ModelMap model,HttpServletRequest request){
return "user/profile";
}
二、在用户登录成功后,在header页面中显示用户名,欢迎。。。
这个方案我们采用springmvc拦截器来实现,我们定义一个类实现了handlerIntercepter接口,有三个方法,在拦截要执行方法前preHandle,在业务处理器处理请求执行完成后,生成视图之前执行postHandle,页面渲染afterCompletion。
我们使用拦截要执行方法前preHandle进行拦截,返回header页面一个flag标记,通过el表达式来判断用户是否登录。