100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤

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

时间:2023-07-12 12:48:32

相关推荐

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>();@Overridepublic void init(FilterConfig filterConfig) throws ServletException {charset = filterConfig.getInitParameter("charset");//到数据库中把黑名单加载进来,这里简单模拟一下set.add("192.168.31.168");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding(charset);//以下演示黑名单过滤技术String ip = request.getRemoteAddr();;//获得客户端的IPif(set.contains(ip)){HttpServletResponse resp = (HttpServletResponse) response;resp.setContentType("text/html;charset=utf-8");resp.getWriter().println("你已被列入黑名单!");}else{//放行chain.doFilter(request, response);}}@Overridepublic 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 陈浩翔** -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 .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="/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 {//取消自动登录,其实就是删除CookieCookie 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 .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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic 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"这个cookieif(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);//放行}@Overridepublic void destroy() {}}

web.xml:

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/xml/ns/javaee /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技术。

完整项目链接:

/chenhaoxiang/Java/tree/master/myAutoLoginWeb

myAutoLoginWeb.zip文件

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

/qq_26525215

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。