美文网首页
基于session的登录模块

基于session的登录模块

作者: 请叫我随风吧 | 来源:发表于2019-05-16 09:02 被阅读0次

    这是我学习使用的登录模块,假如有需要的话可以参考。如果有大神的话也可以指点我的不足。十分感谢。

    首先是登录页面的展示

    接下来是页面的代码部分

            <div class="login-content-son">
                <h1>用户登录</h1>
                    <div class="login-inp">
                        <form id="testform" action="${pageContext.request.contextPath}/postlogin" method="post">
                        <input id="username" name="username" type="text" class="login-manager" placeholder="请输入用户名">
                        <input id="password" name="password" type="password" class="login-pass" placeholder="请输入密码">
                        <div id="mpanel2" ></div>//这里嵌入的验证码模块,验证码模块使用的是verify.js
                        <button id="check-btn" type="button" class="login-btn" >登录系统</button>
                        </form>
                    </div>
            </div>
    
    页面部分的代码就是常规的form表单信息的提交,这部分就不再过多赘述。接下来看后台代码。
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.context.support.SpringBeanAutowiringSupport;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @Author robin
     * @Description: TODO
     * @Param:
     * @Return:
     * @Create: 2018/6/4 22:18
     *
     */
    @WebServlet("/postlogin")
    public class LoginServlet extends HttpServlet {
    
        public void init(ServletConfig config) throws ServletException {
            SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
                    config.getServletContext());
        }
    
        @Autowired
        UserService userService;
    
        @Override
        public void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
    
            int a=userService.getMaxNum();
            String username= httpServletRequest.getParameter("username");
            String password =httpServletRequest.getParameter("password");
            User user= null;
            try {
                user = userService.getUserCheck(username);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if(user ==null){
                httpServletRequest.setAttribute("errormessage", "账号不存在或者输入有误");
                httpServletRequest.getRequestDispatcher("/login").forward(httpServletRequest, httpServletResponse);
                return;
            }else if(user != null && user.getUserStatus()==1){
                httpServletRequest.setAttribute("errormessage", "账户信息已被禁用,请更换账号或联系管理员解冻");
                httpServletRequest.getRequestDispatcher("/login").forward(httpServletRequest, httpServletResponse);
                return;
            } else{
                String xxx=MD5Util.getMd5(password);
                System.out.println("这是加密之后的密码"+xxx);
                String yyy=user.getPassword();
                System.out.println("这是数据库中的密码"+yyy);
                Boolean type=MD5Util.getMd5(password).equals(user.getPassword());
                System.out.println("这是密码进行对比之后的输出"+type);
                if(type){
                    httpServletRequest.getSession().setAttribute("UserSession", user);
                    if(user.getUsername().equals("admin")){
                        httpServletResponse.sendRedirect("/cms/index");
                    }else{
                        httpServletResponse.sendRedirect("/cms/page/MG_changePassword");
                    }
                    return;
                }else{
                    httpServletRequest.setAttribute("errormessage", "账号不存在或者输入有误");
                    httpServletRequest.getRequestDispatcher("/login").forward(httpServletRequest, httpServletResponse);
                    return;
                }
            }
        }
    }
    
    
    在这里,后台我其实是写的一个webServlet,在这个servlet里面主要是针对用户输入的信息进行判断及校验,我这里设计的时候,所有用户的密码保存在数据库中是密文的形式。加密的方式则是MD5(BASE64(明文))这种形式,及明文先经过base64加密,之后得到的密文再经有md5加密处理。所以笔者在上述代码里用到了一个加密工具类MD5util。

    接下来我将MD5util代码展示如下,仅供有需要的人使用。

    
    import org.apache.commons.codec.binary.Base64;
    import sun.misc.BASE64Encoder;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * @Author robin
     * @Description: TODO
     * @Param:
     * @Return:
     * @Create: 2018/6/4 22:18
     */
    
    public class MD5Util {
        public static String getMd5(String md5code) {
            byte[] bt = md5code.getBytes();
            md5code=(new BASE64Encoder()).encodeBuffer(bt);
            System.out.println("这是加密之后的BASE64编码"+md5code);
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.update(md5code.getBytes("utf-8"));
                byte hash[] = md.digest();
                StringBuffer sb = new StringBuffer();
                int i = 0;
                for (int offset = 0; offset < hash.length; offset++) {
                    i = hash[offset];
                    if (i < 0) {
                        i += 256;
                    }
                    if (i < 16) {
                        sb.append("0");
                    }
                    sb.append(Integer.toHexString(i));
                }
                System.out.println("这事加密之后的MD5(Base64)编码"+sb.toString());
                return sb.toString();
            }
            catch (NoSuchAlgorithmException e) {
                throw new RuntimeException(e);
            }
            catch (Exception e){
                System.out.println(e.getMessage());
                return null;
            }
        }
    }
    
    

    那么后台校验完跳转至具体信息页的时候,具体的信息页中又该如何判断已登录,及展示用户信息呢。所以笔者在具体页面中的处理代码如下。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    
    <!--header-->
        <%
            String rootPath = request.getContextPath();
            String path = request.getContextPath();
            String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
    
            response.setHeader("Pragma","No-cache");
            response.setHeader("Cache-Control","no-cache");
            response.setDateHeader("Expires", 0);
            response.flushBuffer();
    
        %>
        <div class="header-right mg-right">
            <p id="demoxx" class="mg-left">欢迎您</p>
            <a  href="<%=basePath%>/logout" >退出</a>
        </div>
    <script>
        var userid="${sessionScope.UserSession.username}";
        $(function(){
            if(userid==undefined || userid==""){
                alert("您没有登录,请您先登录");
                window.location.href="${pageContext.request.contextPath}/login"
            }else{
                $("#demoxx").text(userid);
            }
    
        });
    
    </script>
    
    笔者这个页面其实是一个头部公用页面,判断是否登录就是就是看是否在session里面拿到了用户信息。当然采用我这种方式进行判断的时候,一定不要忘记 执行response.flushBuffer();不然的话会出现明明登录了却显示未登录。或者明明退出了,却依然显示登录。

    最后展示一下退出登录的后台代码

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    /**
     * @Author robin
     * @Description: TODO
     * @Param:
     * @Return:
     * @Create: 2018/6/4 22:18
     */
    
    @WebServlet("/logout")
    public class LoginOut extends HttpServlet {
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            HttpSession session = req.getSession();
    
            if(session != null){
                User user = (User)session.getAttribute("UserSession");
                req.getSession().removeAttribute("UserSession");
                req.getSession().invalidate();
            }
            resp.sendRedirect("/cms/login");
            return;
        }
    }
    
    
    这里就是和登录的后台主体结构是一致的,其实本质都是一个webServlet,在退出的时候,我移除了session信息。之后重定向到登录页。
    至此,一个简单的登录模块就书写完毕。感谢你的阅读。

    如果一个人永远只做自己会的事,那么将永远无法进步。

    相关文章

      网友评论

          本文标题:基于session的登录模块

          本文链接:https://www.haomeiwen.com/subject/achbaqtx.html