您的位置:首页 > 编程语言 > Java开发

好记性不如烂笔头34-利用java过滤器实现用户自动登录

2015-02-06 14:45 561 查看
在很多的网站中,都有自动登录的功能,实现自动登录的方法有很多种方式,利用J***A过滤器也能够实现用户的自动登录。

1、 实现用户自动登录的基本原理

在用户登陆成功后,发送一个cookie给客户端,cookie的值为用户名和md5加密后的密码。

编写一个AutoLoginFilter,这个filter检查用户是否带有指定名称的cookie来,如果有,则查询cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。

在下面的示例中,为了简单处理,都是用明码进行简单处理。在实际项目中千万不要依样画葫芦。

2、 用J***A过滤器实现用户自动登录的源代码-登录模块

[code]package com.autoLogin;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 通过过滤器实现自动登录-登录模块
 * @author 范芳铭
 */
public class LoginServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String username = request.getParameter("name");
        String password = request.getParameter("pass");
        response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
        //通过设置响应头控制浏览器以UTF-8的编码显示数据,浏览器显示乱码的解决方法
        response.setHeader("content-type", "text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        User user = null;
        user = (User)request.getSession().getAttribute("user");
        if (user == null){ //如果不能从过滤器中获取user对象,那么看是否用户输入了登录必要的信息
            user = new User();
            user.setName(username);
            user.setPass(password);
        }

        //验证,简化处理
        if((user.getName() == null) || (user.getPass() == null)){
            out.print("用户名或密码不对!!");
            return;
        }else{ //有内容就当成功
            request.getSession().setAttribute("user", user);
            //发送自动登陆cookie给客户端浏览器进行存储
            sendAutoLoginCookie(request,response,user);
            out.print("登录成功");
            //request.getRequestDispatcher("/index.jsp").forward(request, response);    
        }
    }

    //发送自动登录cookie给客户端浏览器
    private void sendAutoLoginCookie(HttpServletRequest request, HttpServletResponse response, User user) {
        if (request.getParameter("logintime")!=null) {
            int logintime = Integer.parseInt(request.getParameter("logintime"));
            //创建cookie,cookie的名字是autologin,值是用户登录的用户名和密码,用.进行分割
            Cookie cookie = new Cookie("autologin",user.getName() + "." + user.getPass());
            //设置cookie的有效期
            cookie.setMaxAge(logintime);
            //设置cookie的有效路径
            cookie.setPath(request.getContextPath());
            //将cookie写入到客户端浏览器
            response.addCookie(cookie);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}


3、 用J***A过滤器实现用户自动登录的源代码-过滤器模块

[code]package com.autoLogin;

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;
/**
 * 通过过滤器实现自动登录-过滤器
 * @author 范芳铭
 */
public class AutoLoginFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        // 如果已经登录了,就直接chain.doFilter(request, response)放行
        if (request.getSession().getAttribute("user") != null) {
            chain.doFilter(request, response);
            System.out.println("用户名称和密码匹配,自动登录成功");
            return;
        }

        // 1.得到用户带过来的authlogin的cookie
        String value = null;
        Cookie cookies[] = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if (cookies[i].getName().equals("autologin")) {
                value = cookies[i].getValue();
            }
        }

        // 2.得到 cookie中的用户名和密码
        if (value != null) {
            String username = value.split("\\.")[0];
            String password = value.split("\\.")[1];

            // 3.根据用户名和密码获取用户信息,这里简单处理
            User user = new User();
            String name = user.getName();
            String pass = user.getPass();

            // 4.检查用户带过来的md5的密码和数据库中的密码是否匹配,这里直接用明码示例
            if (username.equals(name) & password.equals(pass)) {
                request.getSession().setAttribute("user", user);
                System.out.println("用户名称和密码匹配");
            } else {
                System.out.println("用户名称和密码不对,不能自动登录。");
            }
        }

        chain.doFilter(request, response);
    }

    public void destroy() {

    }

    public void init(FilterConfig filterConfig) throws ServletException {

    }
}


4、 用J***A过滤器实现用户自动登录的源代码-用户模块

[code]package com.autoLogin;
/**
 * 通过过滤器实现自动登录-简单用户模块-仅用于示例
 * @author 范芳铭
 */
public class User {
    private String name;
    private String pass;

    public User(){
        this.name = "ffm";
        this.pass = "pass";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }

}


5、 修改web.xml

[code]    <filter>
        <filter-name>easyFilter</filter-name>
        <filter-class>com.autoLogin.AutoLoginFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>easyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.autoLogin.LoginServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

6、      用J***A过滤器实现用户自动登录的源代码-移除cookie模块
有的业务不需要使用cookie,需要进行移除,可以用下面的类进行处理:

``````

package com.autoLogin;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CancelAutoLoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 移除存储在session中的user
        request.getSession().removeAttribute("user");
        // 移除自动登录的cookie
        removeAutoLoginCookie(request, response);
        // 注销用户后跳转到登录页面
        request.getRequestDispatcher("/login.jsp").forward(request, response);
    }

    /**
     * @Description: 删除自动登录cookie,
     *               JavaWeb中删除cookie的方式就是新创建一个cookie,新创建的cookie与要删除的cookie同名,
     *               设置新创建的cookie的cookie的有效期设置为0,有效路径与要删除的cookie的有效路径相同
     */
    private void removeAutoLoginCookie(HttpServletRequest request,
            HttpServletResponse response) {
        // 创建一个名字为autologin的cookie
        Cookie cookie = new Cookie("autologin", "");
        // 将cookie的有效期设置为0,命令浏览器删除该cookie
        cookie.setMaxAge(0);
        // 设置要删除的cookie的path
        cookie.setPath(request.getContextPath());
        response.addCookie(cookie);
    }

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


7、 最终运行结果

输入url测试地址:http://localhost:8080/webStudy/login?name=ffm&pass=pass&logintime=100

http://localhost:8080/webStudy/login 进行测试。

测试结果:

登录成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: