登录:
- 准备静态页面(注意文本输入框必须要有对应的name),
- 提交按钮要使用butto类型,不然在表单内部按钮将会作为submit提交,全局刷新。
- 前端点击登录按钮以后将参数提交到后台,后台接收参数,通过用户名去数据库里面查询,
- 如果用户名为空那么就请返回一个自定义异常,用户不存在。
- 如果用户存在密码不相同,返回给前端一个自定义异常密码不正确。
- 如果用户密码都正确就返回用户。
//service层逻辑处理
@Override
public User findUserByPasswordAndUsername(String username, String password) throws AuthenticationException {
//通过用户名查询用户对象
User user = userMapper.findUserByPasswordAndUsername(username);
//如果用户为空,就证明数据库没有这个用户名
if(user == null){
throw new AuthenticationException("用户名不存在!!!");
}
//如果密码不相等,证明前端传递的密码不正确
if(!user.getPassword().equals(password)){
throw new AuthenticationException("密码错误!!!");
}
return user;
}
controller层
@RequestMapping(value="/login",method=RequestMethod.POST)
@ResponseBody
public AjaxResult login(Long remeber,User user,HttpSession session,HttpServletResponse response,HttpServletRequest request){
try {
User loginUser = userService.findUserByPasswordAndUsername(user.getUsername(), user.getPassword());
//以后只要是登陆用户,必须放到session里面 XXX_IN_SESSION
//定义Constant常量类解决硬编码
session.setAttribute(Constant.USER_IN_SESSION, loginUser);
//记住密码
CookeiUtil.remeber(remeber, loginUser, response, request);
return new AjaxResult();
} catch (AuthenticationException e) {
e.printStackTrace();
return new AjaxResult(false,e.getMessage());
}
}
动态显示用户名
在controller层把用户放在了session中,在前台直接通过session取用户名
<p class="app-sidebar__user-name">${user_in_session.nickName }</p>
回车登录
获取页面根节点
$(document.documentElement).on("keypress",function(){
//回车键对应的遍号为13
if(event.keyCode===13){
login();
}
});
记住密码
前台记住密码复选框传值到后台,选中记住密码就是传值为1到后台。
不勾选就传值为null到后台。
<input id="remeber" name="remeber" value="1" type="checkbox"><span class="label-text">记住我</span>
登录以后如果记住了密码就把登录的密码和用户名放在cookie中
否则就取遍历cookie去查找是否有密码和用户名,有就删除相应的cookie。
public class CookeiUtil {
public static void remeber(Long remeber, User user, HttpServletResponse response, HttpServletRequest request) {
if (remeber != null) {// 记住密码
addCookie(Constant.USERNAME, user.getUsername(), response);
addCookie(Constant.PASSWORD, user.getPassword(), response);
}else{// 不记住密码
// 获取所有的Cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
// 循环遍历获取到的cookies
for (Cookie cookie : cookies) {
// 如果有
if (cookie.getValue().equals(user.getUsername()) || cookie.getValue().equals(user.getPassword())) {
// 删除cookie
cookie.setMaxAge(0);
// 重新设置路径
cookie.setPath("/");// 让在跟路径下面访问的资源,得到这个cookie是死亡了的
// 删除cookie的时候,要和创建cookie的路径一致,否则是删除不掉的
// 放到浏览器
response.addCookie(cookie);
}
}
}
}
}
//设置cookie
public static void addCookie(String key,String value,HttpServletResponse response){
//创建Cookie
Cookie cookie=new Cookie(key, value);
//设置路径
cookie.setPath("/");
//设置生命周期 30天有效
cookie.setMaxAge(60*60*24*30);
//放在浏览器
response.addCookie(cookie);
}
}
controller层登录成功后直接调用这个方法就可以了
CookeiUtil.remeber(remeber, loginUser, response, request);
登录拦截
登录拦截,如果用户没有登录就访问不到我的项目后台。
- 写一个拦截器继承HandlerInterceptorAdapter,重写preHandle方法,获取session。如果session中有用户就放行,如果没有就重定向到登录界面。
public class LogIninvigilator extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取session
HttpSession session = request.getSession();
//获取session的当前用户
Object attribute = session.getAttribute(Constant.USER_IN_SESSION);
//如果用户为空那就跳转到登录页面 使用重定向 url会改变
if(attribute==null){
response.sendRedirect("/system/login");
return false;
}
return true;
}
springmvc配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置单个拦截器 -->
<mvc:interceptor>
<!--拦截的路径 -->
<mvc:mapping path="/system/**"/>
<!--/system/** /system下的所有都不能访问了,不管几级 -->
<!-- 放行的路径 -->
<mvc:exclude-mapping path="/system/login"/>
<!--配置拦截登录器 -->
<bean class="cn.itsource.web.ininvigilator.LogIninvigilator"></bean>
</mvc:interceptor>
</mvc:interceptors>
/*与/**的区别
<!--
/*与/**的区别:
/* 拦截所有的资源(只能拦截一级资源) /a /b /c 都能拦截 /a/b(不能拦截) /a/b/c(不能拦截)
/** 拦截所有的资源(它能拦截多级资源) /a /b /c 拦截 /a/b 拦截 /a/b/c 拦截
-->