JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤

实现用户的自动登录:
解决方案:
设置一个全站拦截的过虑器。
在此过虑器中,读取用户带过来的Cookie信息,然后从中读取用户的用户名和密码,自动帮助用户登录。
即可实现自动登录功能。

用Filter验证用户是否已经登录过。已经登录过了,我们就根据他选择的自动登录来选择让他在多久内能自动登录。

IP黑名单过滤就很简单了,只要在Filter过滤器防范一下就OK。
在init方法中,我们先把黑名单的IP加载进Set<String> set集合,
Set集合有如下特点:

Java.util.HashSet类实现了Java.util.Set接口。
1 它不允许出现重复元素;
2 不保证和政集合中元素的顺序
3 允许包含值为null的元素,但最多只能有一个null元素。

contains方法:

当且仅当 本set包含一个元素 e,并且满足(o==null ? e==null : o.equals(e))条件时,contains()方法才返回true. 

因此 contains()方法 必定使用equals方法来检查是否相等.

需要注意的是: set 中是可以包含 null值的(常见的集合类都可以包含null值).
所以如果添加了null,然后判断是否包含null,将会返回true

黑名单IP过滤:

package cn.hncu.pubs;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharacterFilter implements Filter{
    private String charset;
    //黑名单
    private Set<String> set = new HashSet<String>();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        charset = filterConfig.getInitParameter("charset");

        //到数据库中把黑名单加载进来,这里简单模拟一下
        set.add("192.168.31.168");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding(charset);

        //以下演示黑名单过滤技术
        String ip = request.getRemoteAddr();;//获得客户端的IP
        if(set.contains(ip)){
            HttpServletResponse resp = (HttpServletResponse) response;
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().println("你已被列入黑名单!");
        }else{//放行
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }

}

配置web.xml:

<filter>
    <filter-name>character</filter-name>
    <filter-class>cn.hncu.pubs.CharacterFilter</filter-class>
    <init-param>
        <param-name>charset</param-name>
        <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>character</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这样就可以防止IP在黑名单的用户访问我们的网站了!

用户的自动登录

User值对象:

package cn.hncu.domain;

/**
 * @author 陈浩翔
 *
 * 2016-8-18
 */
public class User {
    private String name;
    private String pwd;
    public User() {
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

LoginServlet.java:

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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

import cn.hncu.domain.User;

public class LoginServlet extends HttpServlet {

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

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //从页面接收登录信息
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        String time = request.getParameter("time");

        //System.out.println(name+","+pwd+","+time);

        User user = new User();
        user.setName(name);
        user.setPwd(pwd);

        if(name!=null && name.trim().length()!=0 && pwd!=null){
            if(name.equals(pwd)){//按理应该到后台去验证登录是否成功,这里直接以用户名和密码相同为登录成功
                request.getSession().setAttribute("user", user);
                //登录成功,就往客户端写一个cookie,将用户名和密码存到cookie中-应该进行加密!
                //为了能够兼容中文,要进行编码
                name = URLEncoder.encode(name, "utf-8");
                pwd = URLEncoder.encode(pwd, "utf-8");

                Cookie cookie = new Cookie("autoLogin", name+"#!#"+pwd);
                cookie.setPath(request.getContextPath());//权限:本项目中的类都可以访问该cookie
                //有效期
                cookie.setMaxAge( 60 * Integer.parseInt(time) );
                response.addCookie(cookie);//存储到客户端
            }else{
                request.getSession().setAttribute("error", "密码错误!");
            }
        }else{
            request.getSession().setAttribute("error", "请输入用户名!");
        }
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }

}

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>演示利用Filter实现自动登录</title>
  </head>

  <body>
    <h2>主页-演示利用Filter实现自动登录</h2>
    <c:if test="${!empty sessionScope.error}">
        <font color="red">${sessionScope.error}</font>
        <c:remove var="error" scope="session"/>
    </c:if>

    <c:if test="${empty sessionScope.user}" var="boo">
        <form action="<c:url value='/LoginServlet'/>" method="post">
            Name:<input type="text" name="name"><br/><br/>
            <!-- 这里为了演示清楚,就直接用text了 -->
            &nbsp;Pwd:<input type="text" name="pwd"><br/>
            <fieldset>
                <legend>自动登录</legend>
                <input type="radio" name="time" value="0" checked="checked">不自动登录<br/>
                <input type="radio" name="time" value="1" >1分钟<br/>
                <input type="radio" name="time" value="60" >1小时<br/>
                <input type="radio" name="time" value="86400" >1天<br/>
                <input type="radio" name="time" value="604800" >1周<br/>
                <input type="radio" name="time" value="2592000" >一个月<br/>
            </fieldset>
                <input type="submit" value="登录">
        </form>
    </c:if>
    <c:if test="${!boo}">
        ${user.name},欢迎回来。
        <a href="<c:url value='/CancelAutoLoginServlet'/>">取消自动登录</a>

    </c:if>
  </body>
</html>

CancelAutoLoginServlet.java-取消自动登录:

package cn.hncu.servlet;

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;

public class CancelAutoLoginServlet extends HttpServlet {

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

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

        //取消自动登录,其实就是删除Cookie
        Cookie cookie = new Cookie("autoLogin", "");
        cookie.setPath(request.getContextPath());//这个路径必须和原来的设置为一样,否则没用的
        cookie.setMaxAge(0);//有效期为0即是删除
        response.addCookie(cookie);
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }
}

AutoLoginFilter.java-自动登录:

package cn.hncu.filter;

import java.io.IOException;
import java.net.URLDecoder;

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 cn.hncu.domain.User;

public class AutoLoginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if(req.getSession().getAttribute("user")==null){//还没有登录,帮你自动登录
            Cookie cs[] = req.getCookies();
            if(cs!=null){
                for(Cookie c :cs){//找"autoLogin"这个cookie
                    if(c.getName().equals("autoLogin")){
                        String str = c.getValue();
                        String vals[] = str.split("#!#");
                        String name = URLDecoder.decode(vals[0], "utf-8");
                        String pwd = URLDecoder.decode(vals[1], "utf-8");

                        //...
                        //这里应该再去后台数据库验证是否登录能够成功,这里我就直接以两者相等来判断
                        if(name.equals(pwd)){//如果成功则返回一个user对象
                            User user = new User();
                            user.setName(name);
                            user.setPwd(pwd);
                            req.getSession().setAttribute("user", user);
                            break;
                        }
                    }
                }
            }

        }
        chain.doFilter(req, response);//放行
    }
    @Override
    public void destroy() {
    }
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <filter>
    <filter-name>character</filter-name>
    <filter-class>cn.hncu.pubs.CharacterFilter</filter-class>
    <init-param>
        <param-name>charset</param-name>
        <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter>
    <filter-name>autoLogin</filter-name>
    <filter-class>cn.hncu.filter.AutoLoginFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>character</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>autoLogin</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>CancelAutoLoginServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.CancelAutoLoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.LoginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>CancelAutoLoginServlet</servlet-name>
    <url-pattern>/CancelAutoLoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

代码里面都有注释!

实现的功能就是自动登录和取消自动登录。

主要利用了过滤器。还有用到cookie技术。

完整项目链接:
https://github.com/chenhaoxiang/Java/tree/master/myAutoLoginWeb
myAutoLoginWeb.zip文件

转载请附上原文博客链接:

http://blog.csdn.net/qq_26525215

时间: 2024-09-24 03:27:11

JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤的相关文章

JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径_java

1.cookie是啥?随手百度了网友的说说 简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机.当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你. 2.cookie在哪里? 3.cookie可以删除吗? 4.cookie实现原理 第一次请求浏览器,在浏览器的cookie存储区,没有co

asp.net用cookie保存用户密码自动登录

本文来学习一下如何在asp.net中用cookie保存用户的帐户密码实现自动登录的功能,强调一下,cookie在客户端保存,是不安全的,推荐使用md5加密保存. asp.net 中,使用cookie保存账号密码.自动登录-- 创建cookie //向客户端写入Cookie HttpCookie hcUserName1 = new HttpCookie("uname"); // 创建一个名为uname的cookie hcUserName1.Expires = DateTime.Now.A

win7用户账户自动登录方法汇总

为了计算机安全,相信使用Windows7系统的朋友大多都为自己的用户账户设置了或简单或复杂的密码,其实对于个人电脑来说,开机登录输入密码有时候会显得累赘,毕竟用户账户密码不仅仅是为了防止他人登录.那么有没有方法既设置了用户密码又可以省掉登录输入密码这一步骤呢?今天就为大家简单介绍几种方法. 第一,魔方在手,优化不愁 打开魔方优化大师,找到优化设置大师,依次"用户管理","用户登录管理"功能. 勾选"以下列账号自动登录"功能,键入需要自动登录的用户

详解JavaEE使用过滤器实现登录(用户自动登录 安全登录 取消自动登录黑用户禁止登录)_java

在我们生活中,对于账户的自动登录已经很常见了,所以利用过滤器实现这个功能. 主要介绍用户的自动登录和取消自动登录,以及实现一天自动登录或者n天实现自动登录,当用户ip被加入到黑名单之后,直接利用过滤器返回一个警告页面. 过滤器的功能很是强大,我们只需要在写好的前台后servlet之后进行添加就可以实现这个功能 Ps:这个仅仅只是一个演示而已,里面的访问数据库的部分,自己随意模拟了下,主要是突出实现自动登录的功能. 前台代码: 前台代码是成功与否都在这个页面显示.用到的技术:jstl标签的应用,s

⑧javaWeb之在例子中学习(过滤器Filter) 前言

Fitler(过滤器) 过滤器filter是拦截请求,并对传给请求资源的ServletRequest 或 ServletResponse 进行处理的一个对象.可以用于登录,加密和解密,会话检查,图片转换等等   过滤器执行机制图: Filter API : http://docs.oracle.com/javase/6/docs/api/ Filter详解 Filter接口的构成:       所有的Filter类都必须实现javax.servlet.Filter接口.这个接口含有3个过滤器类必

JavaWeb 后端 &lt;十二&gt; 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器

一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤 二.编写步骤和执行过程 1.编码步骤: a.编写一个类:实现javax.servlet.Filter接口 public class FilterDemo1 implements Filter {           public FilterDemo1(){         System.out.println("调用了默认的构造方法

更好的用户体验:过滤器(Filter)的搜索

最简单的搜索引擎不过是一个输入框,用户输入关键字.有的搜索引擎(例如谷歌)支持使用一些语法来控制搜索参数,例如逻辑控制:和.或.非等. 后来采用了过滤器(Filter)的搜索,给用户带来的更好的体验.用户甚至什么关键字也不输入,也可以找到需要的结果. 例如淘宝的搜索过滤器: AJAX技术的引入,给搜索过滤器带来了更好的体验.集合了AJAX技术后,用户无论是更改关键字还是过滤条件,搜索结果都根据用户输入实时变更. 应用过滤器可以不用跳转页面,节省了用户的时间,同时,可以很好地允许用户随时修正过滤条

JavaWeb过滤器的运行机制理解及过滤器.监听器.拦截器-原理&amp;区别

过滤器Filter 一.过滤器的概念. Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 二.过滤器的运行机制.   没有加Filter的web项目运行机制如下:   加上Filter的web运行机制: 由此可见:Filter的作用

servlet和JSP过滤器Filter

js|servlet 或许,servlet API的2.3版本中最重要的一个新功能就是能够为servlet和JSP页面定义过滤器.过滤器提供了某些早期服务器所支持的非标准"servlet链接"的一种功能强大且标准的替代品.过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息.在这之后,过滤器可以作如下的选择:l 以常规的方式调用资源(即,调用servlet或JSP页面).l