在我們生活中,對于賬戶的自動登錄已經很常見了,所以利用過濾器實現這個功能。
主要介紹用戶的自動登錄和取消自動登錄,以及實現一天自動登錄或者n天實現自動登錄,當用戶ip被加入到黑名單之后,直接利用過濾器返回一個警告頁面。
過濾器的功能很是強大,我們只需要在寫好的前臺后servlet之后進行添加就可以實現這個功能
Ps:這個僅僅只是一個演示而已,里面的訪問數據庫的部分,自己隨意模擬了下,主要是突出實現自動登錄的功能。
前臺代碼:
前臺代碼是成功與否都在這個頁面顯示。用到的技術:jstl標簽的應用,session讀取值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<%@ 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里面,頁面跳轉(轉發)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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這說明這是沒有登錄的,直接踢回登錄界面,否,則放行
代碼呈上:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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都需要輸入,太麻煩,我們采用過濾器實現;
代碼呈上:
1
2
3
4
5
6
7
8
9
10
11
|
<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代碼呈上:
1
2
3
4
5
6
7
8
|
<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容器添加值。
代碼呈上:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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); //一定要放走哦。。 } |
黑名單用戶
黑名單用戶,不準登錄,直接告訴它結果
代碼呈上:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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,效率很高。
1
2
3
4
5
6
7
|
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.
代碼呈上:
1
2
3
4
5
6
7
8
|
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" ); } |
上面這些就能實現這些簡答的功能了。
以上所述是小編給大家介紹的詳解JavaEE使用過濾器實現用戶自動登錄 安全登錄 取消自動登錄黑用戶禁止登錄的相關知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!