免登录功能
/*
* 10天免登录操作
* 第一部分业务:在登录的时候操作,login.do
* 1.用户登录,勾选10天免登录
* i.给复选框一个标识,将标识传递到后台
* ii.后台接收到标识后,开始进行免登录操作
* 2.将用户名和密码存入cookie中(传统项目可以,金融/电商不允许这样操作)
* 安全问题?
* i.拦截器会拦截其他请求,只放行了登录请求和跳转到登录页面的请求
* ii.由于在我们输入密码以后,会对密码进行MD5加密操作,
* 故存入cookie中的数据都是加密后的数据,即使加密后的数据泄漏,也无法登录,
* 因为在登录时会对密码再次加密,二次加密后的密码,与数据库中的密码无法对应
* 3.设置cookie的一些属性:
* i.cookie过期时间:60*60*24*10 10天
* ii.cookie的存放路径:/ 根目录下,保证在任意路径下都能访问到cookie中的数据
*
* 第二部分业务:对跳转到登录页面的请求进行操作,toLogin.do
* 4.获取cookie中的用户名和密码
* 5.自动进行登录
* 调用service.login()方法进行登录
* 6.将自动登录后的用户存入session中
*
*/
-
拦截器
在web.xml中配置
<!-- 欢迎页面 当访问http://127.0.0.1:8080/crm时,会自动找到index.jsp --> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list>
在index.jsp中配置
<!--跳转到登录页面--> <script type="text/javascript"> document.location.href = "settings/user/toLogin.do"; </script>
在applicationContext-web.xml中配置
<!-- 权限控制的拦截器 --> <mvc:interceptors> <mvc:interceptor> <!--对所有的请求都拦截--> <mvc:mapping path="/**"/> <!--对登录请求放行--> <mvc:exclude-mapping path="/settings/user/login.do"/> <!--对跳转到登录页面的请求放行--> <mvc:exclude-mapping path="/settings/user/toLogin.do"/> <!--注册的拦截器--> <bean class="com.mryang.crm.interceptor.LoginInterceptor"/> </mvc:interceptor> </mvc:interceptors>
在拦截器中设置
public class LoginInterceptor implements HandlerInterceptor { /** * 控制器方法执行 之前 执行的方法 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { // 只有用户登录后才放行 User user = (User) request.getSession().getAttribute("user"); if (user == null){//用户未登录,抛出异常 // 异常处理器会帮我们重定向到登录页面 // InterceptorException():自定义异常 throw new InterceptorException(); } return true; } /** * 控制器方法执行 之后 执行的方法 */ @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } /** * 页面接在完成后执行的方法 */ @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
-
前端操作
-
给免登录复选框一个标识
-
复选框添加点击事件
//10天免登录操作 // 给复选框添加点击事件 $("#loginFlag").click(function () { // 获取复选框状态 var flag = $("#loginFlag").prop("checked") if (flag){//选中标记,并自定义标识值 $("#flag").val("select") }else{//未选中 $("#flag").val("") } // alert($("#flag").val()) })
-
点击登录时获取标识信息
// 10天免登录标记 var flag = $("#flag").val() // 使用ajax进行数据传递
-
-
后端操作
-
执行登录操作时,login.do
// 首先接收flag的值 // 其次只有在用户验证通过后才能进行此操作,否则写入cookie中的信息有可能是错误 if ("select".equals(flag)){ // 将用户名和密码存放到cookie中 Cookie loginActCookie = new Cookie("loginAct", loginAct); // 密码要存入加密后的密码 Cookie loginPwdCookie = new Cookie("loginPwd", md5Pwd); // cookie的相关参数 int editTime = 60*60*24*10;// 10天 // 设置cookie的过期时间 loginActCookie.setMaxAge(editTime); loginActCookie.setPath("/"); loginPwdCookie.setMaxAge(editTime); loginPwdCookie.setPath("/"); // 将cookie对象写回浏览器 response.addCookie(loginActCookie); response.addCookie(loginPwdCookie); }
-
跳转登录页面时,toLogin.do
// 获取cookie Cookie[] cookies = request.getCookies(); // 将cookie中的值与用户名和密码进行对比 String loginAct=null; String loginPwd=null; for (Cookie cookie : cookies) { if ("loginAct".equals(cookie.getName())){ // 获取到用户名称 loginAct = cookie.getValue(); // 结束本次循环 continue; } if ("loginPwd".equals(cookie.getName())){ loginPwd = cookie.getValue(); } } // 自动登录操作 if (loginAct != null && loginPwd != null) {// 获取到了用户名和密码 // 获取用户ip String ip = request.getRemoteAddr(); // 执行自动登录 User autoLoginUser = userService.login(loginAct, loginPwd, ip); if (autoLoginUser != null){// 登录成功 // 将user存储到session中 request.getSession().setAttribute("user", autoLoginUser); // 如果登录成功,直接跳转到首页 return "redirect:/workbench/toIndex.do"; } }
-