美文网首页从零学Java笔录凯哥Java-工作总结
Javaweb之Filter案例练习-自动登录问题和MD5加密

Javaweb之Filter案例练习-自动登录问题和MD5加密

作者: 凯哥Java | 来源:发表于2019-08-17 09:25 被阅读1次

    自动登录问题和MD5加密

    前面已经完成了Filter的自动登录,但是有问题,我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截。这肯定不合适。我们本来访问/login.jsp,本来就是去登录,结果也进行了拦截。

    解决自动登录问题

    其实,我们可以在AutoLoginFilter.java这个文件中写if语句来判断,虽然web.xml文件还是配置拦截/*, 但是只有在if满足条件,才进行拦截,否则,直接放行就好。

    下面if条件,我们不希望/login.jsp 和/loginServlet这两个请求地址被拦截,所以这里取反,使用!符号。意思就是除了这两个之外地址都拦截。

    package com.kaigejava.web.filter;

    import java.io.IOException;

    import javax.servlet.Filter;

    import javax.servlet.FilterChain;

    import javax.servlet.FilterConfig;

    import javax.servlet.ServletException;

    import javax.servlet.ServletRequest;

    import javax.servlet.ServletResponse;

    import javax.servlet.http.Cookie;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import com.anthony.domain.User;

    import com.anthony.service.UserService;

    import com.anthony.service.UserServiceImpl;

    public class AutoLoginFilter implements Filter {

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

    throws IOException, ServletException {

    // 1 转换两个对象 HttpServletRequest HttpServletResponse

    HttpServletRequest req = (HttpServletRequest) request;

    HttpServletResponse resp = (HttpServletResponse) response;

    // 优化

    String uri = req.getRequestURI(); // 浏览器中url端口8080后面部分

    String path = req.getContextPath(); // 应用名称

    path = uri.substring(path.length()); // /login.jsp

    if (!("/login.jsp".equals(path)) || ("/loginServlet".equals(path))) {

    // 2.处理业务, 这里是得到cookies

    // 优化

    User user = (User) req.getSession().getAttribute("user");

    if (user == null) { // 说明从来没有登录过

    Cookie[] cookies = req.getCookies();

    String username = "";

    String password = "";

    for (int i = 0; cookies != null && i < cookies.length; i++) {

    if ("user".equals(cookies[i].getName())) {

    String value = cookies[i].getValue(); // username&password这样一个格式字符串

    // 得到用户名和密码

    String[] values = value.split("&");

    username = values[0];

    password = values[1];

    }

    }

    UserService us = new UserServiceImpl();

    User u = us.findUser(username, password);

    if (u != null) { // 如果登录成功,把用户信息存到session中

    req.getSession().setAttribute("user", u);

    }

    }

    }

    // 3.放行

    chain.doFilter(request, response);

    }

    public void init(FilterConfig fConfig) throws ServletException {

    }

    }

    可以再次测试下,例如在LoginServlet中或者打印用户名和密码字段,可以发现只执行了一次登录,也就是没有被拦截。

    MD5加密

    第一个要知道的是MD5(Message-Digest Algoorithm 5)是一种不可逆的加密算法。也就是只能加密,不能解密操作。那么我们登录是如何做到呢,一般来说数据库中用户名密码肯定采用MD5加密。在后台拿到前端获取密码,然后把这个密码通过MD5加密,然后传入数据库和密码这栏比较,相等就说明密码一样。

    先来看看MD5加密效果

    上面这个图是用户密码在数据库中是没有加密过的,下面我们执行把第二个用户进行md5加密之后,看看加密之后密码处的效果。

    UPDATE users SET PASSWORD=MD5(PASSWORD) WHERE id=2;

    这个一长串密码就是MD5加密之后的效果。

    Java中如何使用MD5加密

    这个MD5加密方法算一个工具类吧,网上很容易搜到,下面是代码方法

    package com.kaigejava.util;

    import java.math.BigInteger;

    import java.security.MessageDigest;

    import java.security.NoSuchAlgorithmException;

    public class MD5Utils {

    public static String md5(String plainText) {

    byte[] secreBytes = null;

    try {

    secreBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());

    }catch (NoSuchAlgorithmException e) {

    throw new RuntimeException("没有md5这个算法!");

    }

    String md5code = new BigInteger(1, secreBytes).toString(16);

    for (int i = 0; i < 32 - md5code.length(); i++) {

    md5code = "0" + md5code;

    }

    return md5code;

    }

    }

    登录过程使用加密密码

    在LoginServlet.java中处理登录,这个我们通过request.getParameter(“password”)得到的密码肯定是明文的,这时候我们需要先给password进行MD5加密,然后进行登录操作。(前提是用户注册过程中,后台代码在处理注册的servlet中就把用户密码给进行MD5加密,然后保存在数据中的密码就是加密的形式)

    上面如果是在注册的servlet中也这样对password进行加密。

    相关文章

      网友评论

        本文标题:Javaweb之Filter案例练习-自动登录问题和MD5加密

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