这是我学习使用的登录模块,假如有需要的话可以参考。如果有大神的话也可以指点我的不足。十分感谢。
首先是登录页面的展示
接下来是页面的代码部分
<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信息。之后重定向到登录页。
至此,一个简单的登录模块就书写完毕。感谢你的阅读。
如果一个人永远只做自己会的事,那么将永远无法进步。
网友评论