主要介紹struts2與cookie結合實現自動登錄
struts2與cookie結合時要注意采用.action 動作的方式實現cookie的讀取
struts2的jar包
鏈接數據庫文件 db.properties
1
2
3
4
|
dbDriver = oracle.jdbc.driver.OracleDriver url = jdbc:oracle:thin: @localhost : 1521 :orcl userName=test password=password |
dao層類代碼,通過登錄名獲取用戶信息
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package com.struts.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.struts.dao.UserDao; import com.struts.proj.User; import com.struts.util.BeanConnection; public class UserDaoImpl implements UserDao { private BeanConnection dbconn = new BeanConnection(); public User login(String loginname) { Connection conn = dbconn.getConnection(); ResultSet rs = null ; String selsql = "select * from t_scoa_sys_user where f_loginname='" +loginname+ "'" ; //System.out.println(selsql); PreparedStatement pstmt = null ; User user = null ; try { pstmt = conn.prepareStatement(selsql); //pstmt.setString(3, loginname); rs = pstmt.executeQuery(); while (rs.next()){ user = new User(); user.setId(rs.getLong( 1 )); user.setF_username(rs.getString( 2 )); user.setF_loginname(rs.getString( 3 )); user.setF_sex(rs.getString( 4 )); user.setF_state(rs.getString( 5 )); user.setF_email(rs.getString( 6 )); user.setF_mobilephone(rs.getString( 7 )); user.setF_secretaryid(rs.getLong( 8 )); user.setF_password(rs.getString( 9 )); user.setF_order(rs.getLong( 10 )); user.setF_note(rs.getString( 11 )); user.setF_infomodifytemplateid(rs.getLong( 12 )); } } catch (SQLException e) { e.printStackTrace(); } return user; } public void save(User user) { } public static void main(String[] args) { UserDaoImpl daoimpl = new UserDaoImpl(); daoimpl.login( "admin" ); } } |
工具類 CookieUtils類
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package com.struts.util; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.lang.xwork.StringUtils; import org.apache.struts2.ServletActionContext; import com.struts.action.LoginAction; import com.struts.proj.User; import com.struts.service.UserService; import com.struts.service.impl.UserServiceImpl; public class CookieUtils { public static final String USER_COOKIE = "user.cookie" ; // 增加cookie public Cookie addCookie(User user) { Cookie cookie = new Cookie(USER_COOKIE, user.getF_loginname() + "," + DESEDE.decryptIt(user.getF_password())); cookie.setMaxAge( 60 * 60 * 24 * 365 ); return cookie; } // 得到cookie public boolean getCookie(HttpServletRequest request, UserService userService) { request = ServletActionContext.getRequest(); Cookie[] cookies = request.getCookies(); userService = new UserServiceImpl(); if (cookies != null ) { for (Cookie cookie : cookies) { if (CookieUtils.USER_COOKIE.equals(cookie.getName())) { String value = cookie.getValue(); // 判斷字符是否為空 if (StringUtils.isNotBlank(value)) { String[] spilt = value.split( "," ); String loginname = spilt[ 0 ]; String password = spilt[ 1 ]; User user = userService.login(loginname, password); if (user != null ) { HttpSession session = request.getSession(); session .setAttribute(LoginAction.USER_SESSION, user); // 添加用戶到session中 return true ; } } } } } return false ; } // 刪除cookie public Cookie delCookie(HttpServletRequest request) { request = ServletActionContext.getRequest(); Cookie[] cookies = request.getCookies(); if (cookies != null ) { for (Cookie cookie : cookies) { if (USER_COOKIE.equals(cookie.getName())) { cookie.setValue( "" ); cookie.setMaxAge( 0 ); return cookie; } } } return null ; } } |
service層代碼,驗證用戶名和密碼是否正確,密碼我本地用了加密算法,需要解密,友友們可以去掉
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
|
package com.struts.service.impl; import com.struts.dao.UserDao; import com.struts.dao.impl.UserDaoImpl; import com.struts.proj.User; import com.struts.service.UserService; import com.struts.util.DESEDE; public class UserServiceImpl implements UserService { UserDao userDao = new UserDaoImpl(); public User login(String loginname, String password) { User user = userDao.login(loginname); if (user == null ) { System.out.println( "用戶名不存在,請檢查后重新登錄!" ); } if (!DESEDE.decryptIt(user.getF_password()).equals(password)) { System.out.println( "密碼錯誤" ); } return user; } public static void main(String[] args) { UserServiceImpl useimp = new UserServiceImpl(); System.out.println(useimp.login( "admin" , "1234" )); } } |
struts2的配置文件struts.xml,loginAction和ValidateCodeAction驗證碼的驗證
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
|
<?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd" > <struts> <constant name= "struts.i18n.reload" value= "true" /> <constant name= "struts.devMode" value= "true" /> < package name= "loginResult" extends = "struts-default" namespace= "/" > <action name= "loginAction" class = "com.struts.action.LoginAction" > <result name= "success" type= "redirect" >/success.jsp</result> <result name= "error" >/error.jsp</result> <result name= "login" type= "redirect" >/login.jsp</result> </action> <!-- 驗證碼 --> <action name= "validate" class = "com.struts.action.ValidateCodeAction" > <param name= "width" > 60 </param> <param name= "height" > 20 </param> <param name= "fontSize" > 18 </param> <param name= "codeLength" > 4 </param> <result type= "stream" > <param name= "contentType" >image/jpeg</param> <param name= "inputName" >inputStream</param> </result> </action> </ package > </struts> |
action文件類 LoginAction
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
package com.struts.action; import java.util.Map; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.struts.proj.User; import com.struts.service.UserService; import com.struts.service.impl.UserServiceImpl; import com.struts.util.CookieUtils; import com.struts.util.DESEDE; public class LoginAction extends ActionSupport { private static final long serialVersionUID = 6650955874307814247L; private String f_loginname; private String f_password; private HttpServletResponse response; private HttpServletRequest request; private Map<String, Object> session; private CookieUtils cookieUtils = new CookieUtils(); private boolean userCookie; private String validateCode; public static final String USER_SESSION = "user.session" ; UserService userService = new UserServiceImpl(); public String autoLogin() throws Exception { request = ServletActionContext.getRequest(); if (cookieUtils.getCookie(request, userService)) { return "success" ; } else return "login" ; } @Override public String execute() throws Exception { HttpSession session = ServletActionContext.getRequest().getSession(); try { String code = (String) session.getAttribute( "validateCode" ); if (validateCode == null || !validateCode.equals(code)) { System.out.println( "驗證碼輸入有誤,請正確輸入" ); return "error" ; } if (f_loginname != null && ! "" .equals(f_loginname) && ! "" .equals(f_password) && f_password != null ) { User user = userService.login(f_loginname, f_password); // 判斷是否要添加到cookie中 String psswd = DESEDE.decryptIt(user.getF_password()); if (user != null && psswd.equals(f_password)) { if (userCookie) { Cookie cookie = cookieUtils.addCookie(user); ActionContext.getContext().get( "response" ); ServletActionContext.getResponse().addCookie(cookie); } session.setAttribute(USER_SESSION, user); return "success" ; } } } catch (Exception e) { e.printStackTrace(); } return "login" ; } // 用戶退出 public String logout() { request = ServletActionContext.getRequest(); response = ServletActionContext.getResponse(); HttpSession session = ServletActionContext.getRequest().getSession(); session = request.getSession( false ); if (session != null ) session.removeAttribute(USER_SESSION); Cookie cookie = cookieUtils.delCookie(request); if (cookie != null ) response.addCookie(cookie); return "login" ; } public static void main(String[] args) { LoginAction login = new LoginAction(); try { login.execute(); } catch (Exception e) { e.printStackTrace(); } } public Map<String, Object> getSession() { return session; } public void setSession(Map<String, Object> session) { this .session = session; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this .response = response; } public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this .request = request; } public boolean isUserCookie() { return userCookie; } public void setUserCookie( boolean userCookie) { this .userCookie = userCookie; } public String getF_loginname() { return f_loginname; } public void setF_loginname(String fLoginname) { f_loginname = fLoginname; } public String getF_password() { return f_password; } public void setF_password(String fPassword) { f_password = fPassword; } public String getValidateCode() { return validateCode; } public void setValidateCode(String validateCode) { this .validateCode = validateCode; } } |
驗證碼 ValidataCodeAction ,網上很多驗證碼的例子,可以選擇自己的方式來寫驗證碼
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
package com.struts.action; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Random; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class ValidateCodeAction extends ActionSupport { private static final long serialVersionUID = 1L; private ByteArrayInputStream inputStream; private int width; private int height; private int fontSize; private int codeLength; public ValidateCodeAction() { } public void setCodeLength( int codeLength) { this .codeLength = codeLength; } public void setFontSize( int fontSize) { this .fontSize = fontSize; } public void setHeight( int height) { this .height = height; } public void setWidth( int width) { this .width = width; } public ByteArrayInputStream getInputStream() { return inputStream; } public void setInputStream(ByteArrayInputStream inputStream) { this .inputStream = inputStream; } public String execute() throws Exception { BufferedImage bimage = new BufferedImage(width, height, 1 ); Graphics g = bimage.getGraphics(); Random random = new Random(); g.setColor(getRandomColor(random, 200 , 255 )); g.fillRect( 0 , 0 , width, height); g.setFont( new Font( "Times New Roman" , 0 , fontSize)); g.setColor(getRandomColor(random, 160 , 200 )); for ( int i = 0 ; i < 155 ; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt( 12 ); int yl = random.nextInt( 12 ); g.drawLine(x, y, x + xl, y + yl); } StringBuffer str = new StringBuffer(); for ( int i = 0 ; i < codeLength; i++) { String randomStr = String.valueOf(random.nextInt( 10 )); str.append(randomStr); g.setColor( new Color( 20 + random.nextInt( 110 ), 20 + random .nextInt( 110 ), 20 + random.nextInt( 110 ))); int x = (width / codeLength - 1 ) * i + random.nextInt(width / (codeLength * 2 )); int y = random.nextInt(height - fontSize) + fontSize; g.drawString(randomStr, x, y); } ActionContext.getContext().getSession().put( "validateCode" , str.toString()); g.dispose(); ByteArrayOutputStream output = new ByteArrayOutputStream(); ImageOutputStream iout = ImageIO.createImageOutputStream(output); ImageIO.write(bimage, "JPEG" , iout); iout.close(); output.close(); ByteArrayInputStream in = new ByteArrayInputStream(output.toByteArray()); setInputStream(in); return "success" ; } private Color getRandomColor(Random random, int fc, int bc) { if (fc > 255 ) fc = 255 ; if (bc > 255 ) bc = 255 ; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } } |
登錄成功頁面success.jsp
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
31
32
33
34
35
36
37
38
39
|
<%@ page language= "java" import = "java.util.*" pageEncoding= "UTF-8" %> <% @page import = "com.struts.util.CookieUtils" %> <% @page import = "org.apache.commons.lang.xwork.StringUtils" %> <%@ taglib uri= "/struts-tags" prefix= "s" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/" ; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > <html> <head> <base href= "<%=basePath%>" > <title>success page</title> </head> <body> <% Cookie[] cookies = request.getCookies(); if (cookies != null ) { for (Cookie cookie : cookies) { if (CookieUtils.USER_COOKIE.equals(cookie.getName())) { String value = cookie.getValue(); // 判斷字符是否為空 if (StringUtils.isNotBlank(value)) { String[] spilt = value.split( "," ); String loginname = spilt[ 0 ]; String password = spilt[ 1 ]; out.println(loginname + "歡迎登陸" ); } } } } %> <s:a action= "loginAction!logout.action" namespace= "/" > 安全退出</s:a> </body> </html> |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!