JavaEE之--------利用过滤器实现用户自动登录,安全登录,取消自动登录黑用户禁止登录

在我们生活中,对于账户的自动登录已经很常见了,所以利用过滤器实现这个功能

主要介绍用户的自动登录和取消自动登录,以及实现一天自动登录或者n天实现自动登录,当用户ip被加入到黑名单之后,直接利用过滤器返回一个警告页面。

过滤器的功能很是强大,我们只需要在写好的前台后servlet之后进行添加就可以实现这个功能

Ps:这个仅仅只是一个演示而已,里面的访问数据库的部分,自己随意模拟了下,主要是突出实现自动登录的功能。

前台代码:

前台代码是成功与否都在这个页面显示。用到的技术:jstl标签的应用,session读取值

<%@ 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>
     </head>

  <body>
  	<c:if test="${!empty sessionScope.error }">
  			你的密码或用户名错误。<!-- 显示后就需要把里面的值移走 -->
  			<c:remove var="error" scope="session"/>
  	</c:if>
  	<c:if test="${empty sessionScope.user }" var="boo">
  	<h2>这是登录的页面</h2>
    		<form action="<c:url value='/LoginServlet'/>"  method="post">
    			NAME:<input type="text" name="name" /><br/>
    			PWD:<input type="text" name="pwd" /><br/>
    			不自动登录:<input type="radio" name="time" value="0" /><br/>
    			一天:<input type="radio" name="time" value="1" /><br/>
    			七天:<input type="radio" name="time" value="7" /><br/>
    		<input type="submit" value="提交" />
    		</form>
    </c:if>
    <c:if test="${!boo }">
    	欢迎您,${sessionScope.user },登录成功
    	<a href="">模块一 </a>
    	<a href="">模块2 </a>
    	<a href="<c:url value='/CancelAutoLogin'/>">取消自动登录</a>
    </c:if>

  </body>
</html>

servlet的实现代码:

和以前的代码一样,只负责和前台交互即可:里面用到的技术有url编码,值存在cookie里面,存在session里面,页面跳转(转发)

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");
			if(name!=null && pwd!=null && name.equals(pwd)){//此处随意写写,后面应该去servvice-->dao访问数据库
				//这里假设登录成功了,我们把信息存入session里面
				request.getSession().setAttribute("user", name);

				//兼容中文,我们需要进行编码
				name=URLEncoder.encode(name, "utf-8");
				pwd=URLEncoder.encode(pwd, "utf-8");
				Cookie c =new Cookie("autologin", name+","+pwd);//这个value不能采用这种方式的,安全性考虑,我们必须知道采用加密,或者二次加密,
				int _time=60*60*24*Integer.valueOf(time);
				c.setMaxAge(_time);
				response.addCookie(c);
				response.sendRedirect(request.getContextPath()+"/index.jsp");//在过滤器中默认的设置是拦截重定向,转发是内部直接转发,不过过滤器,不好办,但是只需要在web.xml中配置就可以了。
			}else{
				request.getSession().setAttribute("error", "1");
				response.sendRedirect(request.getContextPath()+"/index.jsp");
			}
	}

到现在为止,都感觉没有什么技术,和以前的代码一个,现在就是Filter的作用了。

安全登录:

之前我们采用过动态导入来进行安全登录,防止用户进入项目之后,不用登录,随意输入都可以进入界面,动态导入能够实现这个功能,但是,采用过滤器更好。

在过滤器中一般写的都是dofilter();只需要判断session容器里面是否为null,为null这说明这是没有登录的,直接踢回登录界面,否,则放行

代码呈上:

public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
			HttpServletRequest req=(HttpServletRequest) request;
			HttpServletResponse resp=(HttpServletResponse) response;
			String session=(String) req.getSession().getAttribute("user");
			if(session==null){
				System.out.println("非正常登录");
				resp.sendRedirect(req.getContextPath()+"/index.jsp");
			}else{
				System.out.println("成功登录");
				chain.doFilter(req, resp);
			}
	}

字符编码:

字符编码的问题,以前每一次都需要在servlet的dopost()里面自己手动输入,request.setCharacterEncoding("utf-8");每一个servlet都需要输入,太麻烦,我们采用过滤器实现;

代码呈上:

<span style="font-size:18px;">public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
			request.setCharacterEncoding(character);//去客户端接收的编码
			response.setContentType("text/html;charset=utf-8");//设置发出去的编码
			chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
			character=config.getInitParameter("character");//a</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">haracter  设置为全局变量,</span><span style="font-size:18px;">
	}</span>

再上面的character定义为全局变量,初始值在web.xml中配置。

web.xml代码呈上:

<filter>
  	<filter-name>character</filter-name>
  	<filter-class>cn.hncu.Filter.CharacterFilter</filter-class>
  	<init-param>
  		<param-name>character</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>

自动登录:

主要思路:自动登录需要判断session里面是都存有值,有,则登录过了,没有,就去本地cookie查找,存在,去数据库匹配,若匹配成功,就把session容器添加值。

代码呈上:

public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		//自动登录,必须要设置session里面是都有值,有,则当前登录过,没有,就要去访问cookie里面的数据,cookie里面的数据
		//是否和数据库里面的匹配,是,将session里面的值在这里设置,否,放走
		HttpServletRequest req=(HttpServletRequest) request;
		HttpServletResponse resp =(HttpServletResponse) response;
		String session =(String) req.getSession().getAttribute("user");
		if(session==null){//说明当前没有登录过
			Cookie cs[]=req.getCookies();
			if(cs!=null){
				for(Cookie c:cs){
					if(c.getName().equals("autologin")){
						String value=c.getValue();//这是经过加密的,但是我们仅仅只是采用逗号连接了一下。
						String[] strs=value.split(",");//在logserlvet里面采用的是先编码,再采用逗号连接,我们这里需要反过来
						String name=URLDecoder.decode(strs[0], "utf-8");
						String pwd=URLDecoder.decode(strs[1], "utf-8");
						//将name,pwd数据拿到后台访问数据库,我们这里只是随便写写
						if(name.equals(pwd)){
							req.getSession().setAttribute("user", name);//设置session里面的参数
							break;
						}
					}
				}
			}
		}
		chain.doFilter(req, resp);//一定要放走哦。。
	}

黑名单用户

黑名单用户,不准登录,直接告诉它结果

代码呈上:

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req=(HttpServletRequest) request;
		HttpServletResponse resp=(HttpServletResponse) response;
		String ip=req.getRemoteAddr();//获取访问的ip;
		System.out.println(ip+"IIPP");
		if(set.contains(ip)){//在黑名单之内
			System.out.println("set");
			resp.getWriter().print("您属于黑名单..<a href='"+req.getContextPath()+"/index.jsp'>返回</a>");
			//返回也是不行的,因为index向服务器请求的时候就直接拦截了
		}else{
			chain.doFilter(req, resp);
		}
	}

黑名单返回的类型为list最好,我这里是自己手动添加,原本应该从写一个工具类从数据库读取,不止能查,还能增删改--黑名单。

代码呈上:Hashset 定义为全局变量,set里面含有contain,效率很高。

public void init(FilterConfig arg0) throws ServletException {
			//这里是黑名单列表,从数据库中调取出来。这里只是简单的模拟下
		set.add("192.132.0.12");//这是黑IP,这个是从后台数据库拿到的。
		set.add("localhost");
		set.add("192.132.32.4");
		set.add("127.0.0.1");
	}

取消自动登录

当一直自动登录认为不安全,所以我们设置没有自动登录

之前我们知道,自动登录靠的是cookie里面存的技术,所以这里我们只需要将cookie删除就可以了

因为取消自动登录是超链接,所以写的是servlet.

代码呈上:

public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
				Cookie cc=new Cookie("autologin", "");//删除cookie的方法,就建立一个同名connkie,然后设置cookie的setmaxage=0;
				cc.setMaxAge(0);
				cc.setPath(req.getContextPath());
				resp.addCookie(cc);
				resp.sendRedirect(req.getContextPath()+"/index.jsp");
	}

上面这些就能实现这些简答的功能了。

具体资源我已经上传点击打开链接,欢迎大家一起讨论,共同学习。

时间: 2024-10-29 19:10:44

JavaEE之--------利用过滤器实现用户自动登录,安全登录,取消自动登录黑用户禁止登录的相关文章

phpmyadmin设置自动登录和取消自动登录

1首先在phpmyadmin安装目录下找到config.sample.inc.php复制一份文件名改为config.inc.php 2打开config.inc.php 找到 $cfg['Servers'][$i]['auth_type'],将其改为 [html] view plain copy $cfg['Servers'][$i]['auth_type'] = 'config'; 3在下面添加一些代码,phpmyadmin的用户名和密码 [html] view plain copy $cfg[

利用过滤器验证登录 与免登录

建一个类 CheckingLoginAttribute 继承ActionFilterAttribute 重写OnActionExecuting 里面代码: //0.0判断action或者action所在的控制器是否贴有SkipCheckLogin标签否则要验证是否已登录 Type skiptype = typeof(SkipCheckLoginAttribute); if (filterContext.ActionDescriptor.IsDefined(skiptype,false)||fil

盒子 收藏帖子 转移-实现向网页自动填写用户名密码并自动点击登录按钮 完成全自动凳录

//实现向网页自动填写用户名密码并自动点击登录按钮 完成全自动凳录 Function FillForm(WebBrowser: TWebBrowser2; FieldName: String; Value: String): Boolean; Var i, j: Integer; FormItem: Variant; Begin Result := False; //no form on document If WebBrowser.OleObject.Document.all.tags('FO

【web开发】★☆之基于Map实现(用户登录三次失败后)24小时之内限制登录!

[web开发]★☆之基于Map实现(用户登录三次失败后)24小时之内限制登录! 近期在改一个老项目(struts1做的),客户现在想实现如下效果,用户在登录失败三次之后,锁定用户,需要信息部管理人员进行解锁!我第一想法,是在其数据库User表中加一个字段,记录登录失败的次数,但是数据库添加字段需要远程操作数据库,而对方的数据库又被各种加密软件包围!不是很方便,所以想了一下解决方案,利用Map来进行处理! 首先说一个思路,新建实体类,只有两个属性,登录失败次数,登录时间,实现get,set方法!

【Filter】利用过滤器Filter解决post传递的编码问题与利用EL表达式简化参数传递

post传递的编码问题,解决的方式有两种,一种是修改Tomcat的配置文件,这种方式是我反对的,因为你并不能保证自己的工程在任意一个Tomcat都能跑,当然如果以后出现什么情况,处理修改Tomcat配置文件,没有别的的话,那么才修改也不迟,另一种是在页面取值之前使用: request.setCharacterEncoding("utf-8"); 本来这样没什么的,不就一行代码吗?但是在现在JSP编程不停强调页面绝对不能出现后端代码的趋势下,不能使用<[Jsp]使用Post与Get

用户登录三次,禁止登录

1 def menu(): 2 #用户交互界面 3 user_name = input("请输入在用户名:") 4 password = input("请输入密码:") 5 return user_name,password #以元组形式返回值 6 ''' 7 alex 1314 8 ryan 6238 9 egon 1234 10 ''' 11 def write(): 12 #将用户名.密码和登录次数在文件中写成字典的格式 13 user_name_passwo

通过VBS编写自动输入账号和密码、自动登录程序的脚本

通过VBS编写自动输入账号和密码.自动登录的脚本. 请查看附件: 附件中是以QQ为例. 这个脚本的好处是: 1.可以用于开机自动登录 2.可以用于运维人员自动登录一些程序 3.可以用于......

数据库管理系统的登录名、角色,数据库的用户、角色和架构

概述 之前的一篇博客中写到过关于服务器登录名,服务器角色,数据库用户,数据库角色的关系,理论的一些知识,大家可以看看这篇博客:登录名,服务器角色,用户名和数据库角色.本片博客注重操作. 数据库架构 在具体的操作时,先普及一下数据库架构的知识,这里需要注意一下,这里说的数据库架构不是针对数据库的拓扑结构来说的,而是针对数据库管理系统中,针对数据库的一个功能. 举例说架构和架构的好处,数据库为一座楼,那么架构就是一层楼,一层楼中的房子就是表,由表产生的存储过程,触发器等等也都属于这个架构,将一层楼租

ASP.NET MVC应用程序中支持用户使用腾讯QQ和微信以及新浪微博的第三方登录

什么是第三方授权登录,就是一些大家都会有的帐号如QQ.微信.淘宝.微博等账户.通过那些巨头公司提供的api直接实现登录. 当然,我们是不可能得到你的用户名和密码的.不了解的人,可能会存在这个疑虑.我们可以通过第三方授权登录得到如昵称.性别.注册地址.年龄.头像等基本信息.当然,我们也可以得到你账户因为的唯一编码,就是OAuthId.什么是OAuth技术?大家自行了解,这里就不细讲了. 准备资料: 各平台相关授权appid以及appkey(新浪为App Secret) 申请地址: 新浪 申请入口