登录,回车登录,动态显示登录名,记住密码,登录拦截,/*与/**的区别

登录:

  • 准备静态页面(注意文本输入框必须要有对应的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  拦截
    		-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜甜掉在星星上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值