基于session的登录模块

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

首先是登录页面的展示

基于session的登录模块_第1张图片

接下来是页面的代码部分

        
页面部分的代码就是常规的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"%>


    <%
        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();

    %>
    

欢迎您

退出
笔者这个页面其实是一个头部公用页面,判断是否登录就是就是看是否在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的登录模块)