逐步实施项目:登录
“请输入您的账号和密码”
这样的说法你一定很熟悉。现在的app基本上都需要这样的操作。毕竟我们正处于大数据时代。合法收集用户信息以更好地为用户服务是当今常用的方法。今天我就告诉你:
当您打开APP时,首先看到的是登录/注册。登录和注册无处不在,基本上任何APP都需要。
用户登录
在各大信息管理系统中,登录功能是必不可少的。其功能是验证用户的身份并确定用户是否是本网站的会员。只有会员才能访问当前系统。
登录实现步骤:
1、用户填写账号和密码并提交给后台
2、后台获取账号和密码后,发送到数据库进行查询
3、如果查询结果为空,则说明用户填写的账号或密码不正确,应返回用户登录页面并提示重新输入。
4、如果查询结果不为空,则说明用户填写的账号和密码正确,将对应的账号信息分享给(后续请求中,我们需要继续使用当前登录的用户信息),然后跳转到网站主页
按照上面的步骤,我们使用下面的代码来完成相应的功能
1. 登录页面
登录
页面中有很多布局相关的代码。您可以跳过它并专注于与表单元素相关的标签。
@(“/”)
br/>
页面中有很多布局相关的代码。您可以跳过它并专注于与表单元素相关的标签。
@(“/”)
=新的();
创新互联网网站建设专注于聂荣企业网站建设、成都响应式网站建设公司、电商商城网站建设。聂荣网站建设公司为聂荣等地区提供网站建设服务。全流程按需建站策划、专业设计、全程项目跟踪,以创新的互联网建站专业精神和态度为您提供服务
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); String password = req.getParameter("password"); Employee currentUser = service.login(name, password); if(currentUser==null){ //登录失败 req.setAttribute("errorMsg","亲,账户或者密码错误"); req.getRequestDispatcher("/login.jsp").forward(req,resp); return; }else{ //登录成功 req.getSession().setAttribute("USER_IN_SESSION",currentUser); resp.sendRedirect("/employee"); return; }
SQL:
来自姓名=?和=?
登录失败效果
登录成功效果
用户注销 用户注销功能的主要作用是保护用户的账户安全。当用户点击安全退出时,我们需要删除与本次会话相关的信息。
删除方法有两种:
1.删除当前登录的用户信息
存在一个问题:本次会话的其他信息还保存在内存中,没有及时清理。
@(“/”)
br/>用户注销功能的主要作用是保护用户的账户安全。当用户点击安全退出时,我们需要删除与本次会话相关的信息。
删除方法有两种:
1.删除当前登录的用户信息
存在一个问题:本次会话的其他信息还保存在内存中,没有及时清理。
@(“/”)
=新的();
void (req, resp) , {req.().("");
分别(“/.jsp”);
2. 毁掉整个东西(推荐)
@(“/”)
br/>req.().("");
分别(“/.jsp”);
2. 毁掉整个东西(推荐)
@(“/”)
=新的();
void (req, resp), {
请求.().();
分别(“/.jsp”);
验证码
验证码是每个系统必不可少的功能。主要用于防止系统被恶意入侵。如果没有这个功能,我们的系统就会像一扇没有上锁的门。小偷随时可能进来,做坏事。
那么我们来看看登录时如何使用验证码。如果想使用其他模块,原理也是一样的。
1、首先需要在登录页面显示一张验证码图片。用户可以根据图中的文字填写验证码。
2、同时,在生成验证码时,我们需要保存正确的验证码,以供后期验证。
3、用户填写验证码后,提交表单并进行后台验证。
注意:生成验证码的代码不是我们这里的重点。以后如果需要的话可以网上搜一下,我就不贴了。
检查代码
//验证验证码是否正确
n = () 要求.().("N");
= 要求。("");
如果 (!.() && !.(n)) {
如果 (!.(n)) {
= new(“姓名”,姓名);
=新的(“”,);
分别();
分别();
(req, resp, "亲,验证码错误");
} 别的 {
(req, resp, "验证码不能为空或验证码已过期");
无效(请求,响应,)
,
请求。()。("", );
分别(“/.jsp”);
当用户未填写验证码或验证码无效时,应给出错误信息。
如果用户填写的验证码与保存的验证码不匹配,则会给出错误提示。
这样当验证码不正确时,我们就不会继续做登录验证。我们必须等待用户填写正确的验证码,而这是机器无法完成的。
记住账号
该功能的主要目的是提高用户体验,用户登录一次后下次就不用再重新填写账号了。
为了实现这个功能,我们需要在后台共享用户的账户信息
但是,我们应该用什么来实现共享呢?
来吧,想想我们的需求。今天早上十点我第一次登录系统。使用完后,我关闭了浏览器。下午我需要登录几次。明天和后天……
那我想在这个要求下我就不需要再填写账号了。
在这样的需求下,相信大家都能想到一个答案——
数据保存在浏览器中,我们可以设置保存时间,以便关闭浏览器后可以继续使用。
因此,这是我们针对这个需求的最佳解决方案
在登录业务逻辑中添加以下代码,保存账户相关信息以供使用。
//记住账号
= 要求。("");
如果 (!。()) {
//保存用户信息于
= new(“姓名”,姓名);
.(60 60 24);
Cookie rememberMeCookie = new Cookie("rememberMe", rememberMe); rememberMeCookie.setMaxAge(60 * 60 * 24); resp.addCookie(nameCookie); resp.addCookie(rememberMeCookie); } else { //将用户信息从Cookie中移除 Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { if ("name".equals(cookie.getName()) || "rememberMe".equals(cookie.getName())) { cookie.setMaxAge(0); resp.addCookie(cookie); } } }
然后,获取登录页面的数据
="${.name.}">
选择记住我后,登录错误返回到登录页面。此时可以自动获取最后的账户信息。
登录检查
当用户未登录时,除了登录之外,不允许访问系统中的其他模块。如果他访问,他应该直接返回到登录页面。
中,解决这个问题的最佳方法是使用()
过滤器:能够在访问目标资源之前预处理请求,并在响应离开之前预处理响应。
在我们的需求中,我们需要对请求进行预处理,在请求当前资源之前检查用户是否已经登录。
实施步骤:
1. 定义过滤器:
{
列表;
public void init(FilterConfig filterConfig) throws ServletException { //获取到需要校验的资源名称(如果需要校验的资源较多,可以配置不需要校验的资源) String needCheckURI = filterConfig.getInitParameter("needCheckURI"); String[] split = needCheckURI.split(","); //将所有的资源名存放到集合中,待后面进行校验 needCheckURIs = Arrays.asList(split); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; //获取当前请求的资源名 String requestURI = req.getRequestURI(); //如果当前请求的资源是不需要校验的,直接放行 if(!needCheckURIs.contains(requestURI)){ filterChain.doFilter(req, resp); return; } //如果需要校验,判断用户是否登录,是,则放行,反之回到登录页面 Object currentUser = req.getSession().getAttribute("USER_IN_SESSION"); if (currentUser == null) { resp.sendRedirect("/login.jsp"); return; } filterChain.doFilter(req, resp); } public void destroy() { }
2. 将过滤器留给服务器管理
cn..网..
/,/
/*
通过这个过滤器,用户不再能够在未登录的情况下直接访问相关资源,实现了基本的安全控制。
生成系统账号
当系统启动时,我们需要在用户表中拥有一个最小的管理员帐户,以便用户可以登录来管理整个系统。
那么,在启动服务器时如何完成这个需求呢?
其实解决办法有很多,大家应该都能想到。
1.
默认情况下,第一次访问时进行初始化
但也可以在启动服务器时调整为0
初始化时,会执行当前的init方法。
因此,我们在这个方法中完全满足了这个要求
2.
过滤器在启动服务器时初始化
同理,初始化时会执行init方法
因此,这个需求也可以在init方法中完成
3.
之前研究过WEB中的监听器,知道它可以监听作用域(创建/销毁)以及作用域内的属性(添加/删除/修改)。
我们的要求是在启动服务器时创建一个默认帐户
启动服务器时,此时会创建对象
综上所述,我们可以创建一个函数对象监听器,并在创建对象时完成默认账户的创建。
以上三种方法都可以满足我们的需求,但是最终考虑到职责分离的原则,我们应该选择使用监听器,其实现如下
创建监听器
呃{
=新的();
空白 ( ) {
//查询系统默认账户是否存在,如果不存在则创建默认账户
= .();
如果(==空){
=新的();
.("");
.("1");
。(真的);
。节省();
public void contextDestroyed(ServletContextEvent servletContextEvent) { }
注册监听器
cn..网..
这样,当启动服务器时,它会首先查询表,看是否有默认的管理员帐户。
点击查看该系列其他文章
一步步教你如何做项目:项目需求分析
一步一步教你如何做项目:前端界面
一步一步教你如何做项目:多条件过滤