JavaWeb使用过滤器(Filter)实现用户的自动登录

JSP

登陆页面jsp

            <div class="col-md-5">
                <div style="width: 440px; border: 1px solid #E7E7E7; padding: 20px 0 20px 30px; border-radius: 5px; margin-top: 60px; background: #fff;">
                    会员登录USER LOGIN
                    <divdiv>
                    
class="form-horizontal" method="post" action="${pageContext.request.contextPath}/UserHandlerServlet "> <div class="form-group"> <div class="col-sm-6"> "text" class="form-control" id="username" placeholder="请输入用户名" name="username" value = "${cookie.rememberUser.value}"> div> div> <div class="form-group"> <div class="col-sm-6"> "password" class="form-control" id="inputPassword3" placeholder="请输入密码" name="password" value = ""> div> div> <div class="form-group"> <div class="col-sm-3"> "text" class="form-control" id="inputPassword3" placeholder="请输入验证码" name="validateValue"> div> <div class="col-sm-3"> id="loginform:vCode" src="${pageContext.request.contextPath }/validatecode.jsp" onclick="javascript:document.getElementById('loginform:vCode').src='${pageContext.request.contextPath }/validatecode.jsp?'+Math.random();" /> div> div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <div class="checkbox">       div> div> div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> "submit" width="100" value="登录" name="submit" border="0" style="background: url('./images/login.gif') no-repeat scroll 0 0 rgba(0, 0, 0, 0); height: 35px; width: 100px; color: white;"> div> div>
div> div>

JavaWeb使用过滤器(Filter)实现用户的自动登录_第1张图片

servlet

编写servlet处理登陆用户登录操作


public class UserHandlerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UserHandlerServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String handlerType = request.getParameter("handlerType");
        UserService userService = new UserServiceImpl();

        switch (handlerType) {
        // 注册操作
        case "register":
            if(!request.getSession().getAttribute("validateValue").equals(request.getParameter("validateValue"))) {
                response.sendRedirect(request.getContextPath() + "/register.jsp");
                break;
            }
            String registerUsername = request.getParameter("username");
            String registerPassword = request.getParameter("password");
            String registerEmail = request.getParameter("email");
            String registerName = request.getParameter("name");
            String registerSex = request.getParameter("inlineRadioOptions");
            String registerBirthday = request.getParameter("date");
            SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd");
            Date date = null;
            try {
                date = formate.parse(registerBirthday);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            User user = new User(0, registerUsername, registerPassword, registerEmail, registerName, registerSex, date, "未定义");
            if(userService.userRegister(user) != 0) {
                System.out.println("注册成功");
                request.getSession().setAttribute("user", registerUsername);
                response.sendRedirect(request.getContextPath() + "/index.jsp");
            }else {
                System.out.println("注册失败");
                response.sendRedirect(request.getContextPath() + "/register.jsp");
            }
            break;

        //登录操作
        case "login":
            if(!request.getSession().getAttribute("validateValue").equals(request.getParameter("validateValue"))) {
                response.sendRedirect(request.getContextPath() + "/register.jsp");
                break;
            }
            String loginUsername = request.getParameter("username");
            String loginPassword = request.getParameter("password");
            User loginUser = userService.userLogin(loginUsername, loginPassword);
            if(loginUser != null) {
                //判断是否记住用户名
                if("on".equalsIgnoreCase(request.getParameter("jizhu"))) {
                    Cookie cookie = new Cookie("rememberUser",loginUsername);
                    cookie.setMaxAge(3600 * 24 * 365);//设置最大失效时间
                    response.addCookie(cookie);
                }
                //判断是否勾选了自动登录
                if("on".equalsIgnoreCase(request.getParameter("autoLogin"))) {
                    Cookie cookie = new Cookie("autoLoginUser",loginUsername + "-" + loginPassword);
                    cookie.setMaxAge(3600 * 24 * 365);//设置最大失效时间
                    response.addCookie(cookie);
                }
                request.getSession().setAttribute("loginUser", loginUser);
                System.out.println("登陆成功");
                response.sendRedirect(request.getContextPath() + "/index.jsp");
            }else {
                System.out.println("登陆失败");
                response.sendRedirect(request.getContextPath() + "/register.jsp");
            }
            break;
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

Filter

创建自定义过滤器


public class AutoLoginFilter implements Filter{

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;

        //1.查看用户是否登录
        User user = (User) request.getSession().getAttribute("loginUser");

        //2.如果用户未登录,判断是否是登录操作,如果不是与登陆有关的操作就自动登录
        if(user == null) {
            if(!"login".equalsIgnoreCase(request.getParameter("handlerType"))) {
                //3.查看Cookie中是否有自动登录的cookie
                Cookie cookie = CookUtils.getCookieByName("autoLoginUser", request.getCookies());

                //4.判断Cookie是否为空,若不为空就登陆
                if(cookie != null) {
                    String autoUser = cookie.getValue();

                    //5.获取Cookie中保存的用户名和密码   username-password
                    String userName = autoUser.split("-")[0];
                    String userPasswd = autoUser.split("-")[1];

                    //6.登陆用户
                    User loginUser = new UserServiceImpl().userLogin(userName, userPasswd);

                    //7.如果登陆成功将用户保存到session中
                    if(loginUser != null) {
                        request.getSession().setAttribute("loginUser", loginUser);
                    }
                }
            }
        }

        //放行
        arg2.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}

web.xml

配置过滤器


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>lgx_projectdisplay-name>
    <welcome-file-list>
        <welcome-file>index.htmlwelcome-file>
        <welcome-file>index.htmwelcome-file>
        <welcome-file>index.jspwelcome-file>
        <welcome-file>default.htmlwelcome-file>
        <welcome-file>default.htmwelcome-file>
        <welcome-file>default.jspwelcome-file>
    welcome-file-list>

    
    <filter>
        <filter-name>EncodingFilterfilter-name>
        <filter-class>com.fjut.filter.EncodingFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>EncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    
    <filter>
        <filter-name>AutoLoginFilterfilter-name>
        <filter-class>com.fjut.filter.AutoLoginFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>AutoLoginFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>   

    <servlet>
        <description>description>
        <servlet-name>UserHandlerServletservlet-name>
        <servlet-class>com.fjut.servlet.UserHandlerServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>UserHandlerServletservlet-name>
        <url-pattern>/UserHandlerServleturl-pattern>
    servlet-mapping>
web-app>

使用的工具类

CookUtils

import javax.servlet.http.Cookie;

public class CookUtils {
    /**
     * 通过名称在cookie数组获取指定的cookie
     * @param name cookie名称
     * @param cookies  cookie数组
     * @return
     */
    public static Cookie getCookieByName(String name, Cookie[] cookies) {
        if(cookies!=null){
            for (Cookie c : cookies) {
                //通过名称获取
                if(name.equals(c.getName())){
                    //返回
                    return c;
                }
            }
        }
        return null;
    }
}

MD5加密


import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {
    /**
     * 使用md5的算法进行加密
     */
    public static String md5(String plainText) {
        byte[] secretBytes = null;
        try {
            secretBytes = MessageDigest.getInstance("md5").digest(
                    plainText.getBytes());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("没有md5这个算法!");
        }
        String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字
        // 如果生成数字未满32位,需要前面补0
        for (int i = 0; i < 32 - md5code.length(); i++) {
            md5code = "0" + md5code;
        }
        return md5code;
    }
}

你可能感兴趣的:(【02】JavaEE)