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;">
                    <font>会员登录</font>USER LOGIN
                    <div>&nbsp;</div>
                    <form class="form-horizontal" method="post" action="${pageContext.request.contextPath}/UserHandlerServlet ">
                        <div class="form-group">
                            <label for="username" class="col-sm-2 control-label">用户名</label>
                            <div class="col-sm-6">
                                <input type="text" class="form-control" id="username" placeholder="请输入用户名" name="username" value = "${cookie.rememberUser.value}">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="inputPassword3" class="col-sm-2 control-label">密码</label>
                            <div class="col-sm-6">
                                <input type="password" class="form-control" id="inputPassword3" placeholder="请输入密码" name="password" value = "">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="inputPassword3" class="col-sm-2 control-label">验证码</label>
                            <div class="col-sm-3">
                                <input type="text" class="form-control" id="inputPassword3" placeholder="请输入验证码" name="validateValue">
                            </div>
                            <div class="col-sm-3">
                                <img 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">
                                    <label> <input type="checkbox" name="autoLogin"> 自动登录
                                    </label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <label> 
                                    <input type="checkbox" name="jizhu" checked="checked"> 记住用户名
                                    <input type="hidden" name="handlerType" value="login"> 
                                    </label>
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-sm-offset-2 col-sm-10">
                                <input type="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>
                    </form>
                </div>
            </div>

这里写图片描述

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

配置过滤器

<?xml version="1.0" encoding="UTF-8"?>
<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_project</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <!-- 字符编码过滤器 -->
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.fjut.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 自动登录过滤器 -->
    <filter>
        <filter-name>AutoLoginFilter</filter-name>
        <filter-class>com.fjut.filter.AutoLoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AutoLoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>   

    <servlet>
        <description></description>
        <servlet-name>UserHandlerServlet</servlet-name>
        <servlet-class>com.fjut.servlet.UserHandlerServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UserHandlerServlet</servlet-name>
        <url-pattern>/UserHandlerServlet</url-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;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值