手把手教你作JavaWeb项目:登陆模块

现现在,不管是客户端仍是移动端,不管是电动登录仍是社交平台登录,无处不在的“登录”。那么你知道怎么制做吗?今天就为你娓娓道来:java

用户登陆
在各大信息管理系统中,登陆功能是必不可少的,他的做用就是验证用户的身份,判断用户是不是本站的会员,只有会员才能访问当前系统
登陆的实现步骤:
1.用户填写帐号和密码,提交到后台
2.后台获取到帐号和密码后,将其发送到数据库中进行查询
3.查询结果若是为null,说明用户填写的帐号或者密码有误,应该回到登陆页面并提示用户从新输入
4.查询结果若是不为null,说明用户填写的帐号和密码正确,将对应的帐户信息共享到session中(在后面的请求,咱们还须要继续使用当前登陆的用户信息),而后跳转到网站的主页面
按照上面的步骤,咱们使用下面的代码完成了相应功能
1.登陆页面
<form class="form-horizontal" action="/login" method="post">
<div class="form-group">
<label for="inputEmail3" class="col-sm-3 control-label">用户名</label>
<div class="col-sm-9">
<input type="text" name="name" class="form-control" id="inputEmail3">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-3 control-label">密   码</label>
<div class="col-sm-9">
<input type="password" name="password" class="form-control" id="inputPassword3">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<button type="submit" class="btn btn-default">登陆</button>br/></div>
</div>
页面中存在不少布局相关的代码,你们能够直接略过,重点看表单元素相关的标签便可
LoginServlet
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private IEmployeeService service = new EmployeeServiceImpl();web

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:
SELECT * FROM employee WHERE name = ? AND password = ?
登陆失败效果数据库

手把手教你作JavaWeb项目:登陆模块

登陆成功效果浏览器

手把手教你作JavaWeb项目:登陆模块br/>用户注销
用户注销功能的主要做用是保护用户的帐户安全,在用户点击安全退出的时候,咱们须要将本次会话相关的session信息删除
删除的方式有下面两种:
1.删除当前登陆的用户信息
存在问题:本次会话的其余信息仍是保存在内存中,没有及时清理
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
private IEmployeeService service = new EmployeeServiceImpl();
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("/login.jsp");
}
}
2.销毁整个session(推荐)
@WebServlet("/logout")
br/>req.getSession().removeAttribute("USER_IN_SESSION");
resp.sendRedirect("/login.jsp");
}
}
2.销毁整个session(推荐)
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
private IEmployeeService service = new EmployeeServiceImpl();
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().invalidate();
resp.sendRedirect("/login.jsp");
}
}
验证码
验证码是每一个系统必不可少的功能,主要是用来防止系统被恶意***,若是没有这个功能,那么咱们的系统就如同没有上锁的家门同样,小偷随时能进来干坏事
因此咱们来看看,在登陆的时候如何使用验证码,其余模块若是要使用,原理同样安全

手把手教你作JavaWeb项目:登陆模块

1.首先,须要在登陆页面显示出验证码的图片,用户能够根据图片中的文字进行填写
2.同时,在生成验证码的时候,咱们须要将正确的验证码保存到session中,供后面校验使用
3.用户填写好验证码后,提交表单,后台校验
注:生成验证码的代码不是咱们这里的重点,之后若是须要,在网上一搜一箩筐,因此我就不贴出来了
校验代码
//校验验证码是否正确
String randomcode_in_session = (String) req.getSession().getAttribute("RANDOMCODE_IN_SESSION");
String randomCode = req.getParameter("randomCode");
if (!StringUtils.isNullOrEmpty(randomCode) && !StringUtils.isNullOrEmpty(randomcode_in_session)) {
if (!randomCode.equals(randomcode_in_session)) {
Cookie nameCookie = new Cookie("name", name);
Cookie passwordCookie = new Cookie("password", password);
resp.addCookie(nameCookie);
resp.addCookie(passwordCookie);
handleError(req, resp, "亲,验证码错误");
return;
}
} else {
handleError(req, resp, "验证码不能为空或者验证码已失效");
return;
}服务器

private void handleError(HttpServletRequest req, HttpServletResponse resp, String errorMsg)
throws ServletException, IOException
req.getSession().setAttribute("errorMsg", errorMsg);
resp.sendRedirect("/login.jsp");
}
当用户没填写验证码或者session中的验证码失效,都应该给出错误提示
若是用户填写的和session中保存的验证码不匹配,给出错误提示
如此,当验证码不正确的时候,咱们就不会继续作登陆校验,必须等用户填写出正确的验证码才能够,而这一点,机器是没法作到的
记住帐号
该功能的目的主要是想在用户一次登陆以后,下次能够再也不从新填写帐号,增长用户体验
想要实现该功能,咱们须要在后台将用户的帐号信息进行共享
可是,咱们应该使用什么来完成共享呢?
来,想一想咱们的需求,我今天早上十点第一次登录系统,使用完以后,关闭浏览器,下午还须要登录几回,明天后天...
那么我想在这种需求下均可以再也不填写帐号
在这样的需求下,我相信你们可以想到一个答案---cookie
Cookie是将数据保存在浏览器中,并且,咱们能够设置保存的时间,能够在关闭浏览器以后仍然可以继续使用
因此,Cookie就是咱们在这个需求中的最佳解决方案
在登陆的业务逻辑添加以下代码,将帐号相关信息保存到使用Cookie进行保存
//记住我
String rememberMe = req.getParameter("rememberMe");
if (!StringUtils.isNullOrEmpty(rememberMe)) {
//将用户信息保存到Cookie中
Cookie nameCookie = new Cookie("name", name);
nameCookie.setMaxAge(60 60 24);cookie

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);
            }
        }
    }

而后,在登陆页面获取到Cookie中的数据便可
<div class="form-group">
<label for="inputEmail3" class="col-sm-3 control-label">用户名</label>
<div class="col-sm-9">
<input type="text" name="name" class="form-control" id="inputEmail3"
value="${cookie.name.value}">
</div>
</div>session

<label>
<input type="checkbox" name="rememberMe"
${empty cookie.rememberMe.value?"":"checked='checked'"}> Remember me
</label>
当选择了记住我后,登陆错误回到登陆页面,此时可以自动获取到上次的帐号信息app

手把手教你作JavaWeb项目:登陆模块
登陆检查
在用户没有登陆的状况下,不容许访问系统中除登陆之外的其余模块,若是访问,应该直接回到登陆页面
在javaweb中,这个问题的最佳解决方案就是使用过滤器(Filter)
过滤器:可以在访问到达目标资源以前对请求作预处理,在响应离开以前对响应作预处理
在咱们这个需求中,是须要对请求作预处理的,检查用户在请求当前资源以前,是否已经登陆
实现步骤:
1.定义过滤器:CheckLoginFilter
public class CheckLoginFilter implements Filter {
private List<String> needCheckURIs;dom

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.将过滤器交给Tomcat服务器管理
<!--登陆检查过滤器-->
<filter>
<filter-name>CheckLoginFilter</filter-name>
<filter-class>cn.wolfcode.javaweb.web.filter.CheckLoginFilter</filter-class>
<init-param>
<param-name>needCheckURI</param-name>
<param-value>/employee,/department</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CheckLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
有了该过滤器,用户就不能再没有登陆的时候,直接访问相关资源了,作到了一个基本的安全控制
生成系统帐户
当系统启动后,咱们须要在用户表中存在一个最起码的管理员帐户,这样,用户才能登陆进来来管理整个系统
那么,如何实如今启动服务器的时候,完成这个需求呢?
其实解决方案不少,你们也都应该能想到
1.Servlet
Servlet默认状况下是在第一次访问的时候执行初始化操做
可是也能够调整到启动服务器的时候,<load-on-startup>0</load-on-startup>
初始化Servlet的时候,会执行当前Servlet的init方法
因此,咱们彻底在该方法中来完成这个需求
2.Filter
过滤器的初始化就是在启动服务器的时候
和Servlet同样,初始化的时候会执行Filter的init方法
因此,也能够在Filter的init方法中完成该需求
3.Listener
前面学习过WEB中的监听器,知道他可以对做用域(建立/销毁)和做用域中的属性(添加/删除/修改)进行监听
咱们的需求是,在启动服务器的时候建立默认帐户
而在启动服务器的时候,application做用域对象会在这个时候建立
综上,咱们能够建立一个application做用对象监听器,在建立该对象的时候,完成默认帐户的建立
上面三种方式都能完成咱们的需求,但最终从责任分离原则方面考虑,咱们应该选择使用监听器,实现以下
建立监听器
public class SystemManagerCreaterListener implements ServletContextListener {
private IEmployeeService service = new EmployeeServiceImpl();
public void contextInitialized(ServletContextEvent servletContextEvent) {
//查询系统默认帐户是否存在,若是不存在,建立一个默认帐户
Employee manager = service.selectSystemManager();
if(manager==null){
manager = new Employee();
manager.setName("admin");
manager.setPassword("1");
manager.setAdmin(true);
service.save(manager);
}
}

public void contextDestroyed(ServletContextEvent servletContextEvent) {

}

}注册监听器<listener><listener-class>cn.wolfcode.javaweb.web.listener.SystemManagerCreaterListener</listener-class></listener>如此,在启动服务器的时候,先会到员工表中查询,是否存在默认的管理员帐户。点击查看JavaWeb系列的其它文章手把手教你作JavaWeb项目:项目需求分析手把手教你作JavaWeb项目:前台界面手把手教你作JavaWeb项目:多条件过滤前往叩丁狼官网获取更多技术视频看完了吗?看完了就赶快行动起来,打开你的编辑器,开始编译登录界面实现登录注册吧!

相关文章
相关标签/搜索