3.
4. "-//apache software foundation//dtd struts configuration 2.0//en"
5. "http://struts.apache.org/dtds/struts-2.0.dtd">
6.
7.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18. /login.jsp
19.
21. /index.jsp
22.
24.
26. ${goingtourl}
27. /login.jsp
28.
29.
30.
32. /login.jsp
33. /register.jsp
34.
35.
36.
37.
"-//apache software foundation//dtd struts configuration 2.0//en"
"http://struts.apache.org/dtds/struts-2.0.dtd">
/login.jsp
/index.jsp
${goingtourl}
/login.jsp
/login.jsp
/register.jsp
我们是使用的默认的interceptor stack是logininterceptor, 如果你需要让不登入的用户也能访问的话,你需要配置你的action使用defaultstack。 我们这里的login, register使用的就是defaultstack。 这里要注意的是success的result是我们用logininterceptor设过来的值。 这样我们就能够转到用户输入的起始页面。 下面我们再来看看login.jsp 和 loginaction
java代码
1.<%@taglib prefix="s" uri="/struts-tags" %>
2.<%@ page language="java" contenttype="text/html; charset=utf-8"
3. pageencoding="utf-8"%>
4.
5.
6.
7.
wallet-login
8.
9.
10.
login
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<%@taglib prefix="s" uri="/struts-tags" %>
<%@ page language="java" contenttype="text/html; charset=utf-8"
pageencoding="utf-8"%>
wallet-login
login
java代码
1.package com.javaeye.dengyin2000.wallet.actions;
2.
3.import java.util.map;
4.
5.import javax.servlet.http.cookie;
6.import javax.servlet.http.httpservletrequest;
7.import javax.servlet.http.httpservletresponse;
8.
9.import org.apache.commons.lang.stringutils;
10.import org.apache.struts2.interceptor.cookiesaware;
11.import org.apache.struts2.interceptor.servletrequestaware;
12.import org.apache.struts2.interceptor.servletresponseaware;
13.import org.apache.struts2.interceptor.sessionaware;
14.
15.import com.javaeye.dengyin2000.wallet.dao.userdao;
16.import com.javaeye.dengyin2000.wallet.dao.usernotfoundexception;
17.import com.javaeye.dengyin2000.wallet.domains.user;
18.import com.javaeye.dengyin2000.wallet.interceptor.logininterceptor;
19.import com.opensymphony.xwork2.actionsupport;
20.
21.public class loginaction extends actionsupport implements servletresponseaware, servletrequestaware, sessionaware, cookiesaware{
22.
23. private userdao userdao;
24. private string loginname;
25. private string password;
26. private boolean rememberme;
27. private httpservletresponse response;
28. private httpservletrequest request;
29. private map session;
30. private map cookies;
31. private string goingtourl;
32. public string getgoingto {
33. return goingtourl;
34. }
35. public void setgoingto {
36. this.goingtourl = goingtourl;
37. }
38. public boolean isrememberme() {
39. return rememberme;
40. }
41. public void setrememberme(boolean rememberme) {
42. this.rememberme = rememberme;
43. }
44. public string getloginname() {
45. return loginname;
46. }
47. public void setloginname(string loginname) {
48. this.loginname = loginname;
49. }
50. public string getpassword() {
51. return password;
52. }
53. public void setpassword(string password) {
54. this.password = password;
55. }
56.
57.
58. public string login()throws exception{
59. try {
60. user user = userdao.attemptlogin(loginname, password);
61. if (rememberme){
62. cookie cookie = new cookie(logininterceptor.cookie_rememberme_key, user.getloginname() "==" user.getpassword());
63. cookie.setmaxage(60 * 60 * 24 * 14);
64. response.addcookie(cookie);
65. }
66. session.put(logininterceptor.user_session_key, user);
67. string goingtourl = (string) session.get(logininterceptor.going_to_url_key);
68. if (stringutils.isnotblank(goingtourl)){
69. setgoingto;
70. session.remove(logininterceptor.going_to_url_key);
71. }else{
72. setgoingto;
73. }
74. return success;
75. } catch (usernotfoundexception e) {
76. addactionmessage("user name or password is not corrected.");
77. return input;
78. }
79. }
80. public userdao getuserdao() {
81. return userdao;
82. }
83. public void setuserdao(userdao userdao) {
84. this.userdao = userdao;
85. }
86. public void setservletresponse(httpservletresponse response) {
87. this.response = response;
88. }
89. public void setservletrequest(httpservletrequest request) {
90. this.request = request;
91. }
92. public void setsession(map session) {
93. this.session = session;
94. }
95. public void setcookiesmap(map cookies) {
96. this.cookies = cookies;
97. }
98.}
package com.javaeye.dengyin2000.wallet.actions;
import java.util.map;
import javax.servlet.http.cookie;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import org.apache.commons.lang.stringutils;
import org.apache.struts2.interceptor.cookiesaware;
import org.apache.struts2.interceptor.servletrequestaware;
import org.apache.struts2.interceptor.servletresponseaware;
import org.apache.struts2.interceptor.sessionaware;
import com.javaeye.dengyin2000.wallet.dao.userdao;
import com.javaeye.dengyin2000.wallet.dao.usernotfoundexception;
import com.javaeye.dengyin2000.wallet.domains.user;
import com.javaeye.dengyin2000.wallet.interceptor.logininterceptor;
import com.opensymphony.xwork2.actionsupport;
public class loginaction extends actionsupport implements servletresponseaware, servletrequestaware, sessionaware, cookiesaware{
private userdao userdao;
private string loginname;
private string password;
private boolean rememberme;
private httpservletresponse response;
private httpservletrequest request;
private map session;
private map cookies;
private string goingtourl;
public string getgoingto {
return goingtourl;
}
public void setgoingto {
this.goingtourl = goingtourl;
}
public boolean isrememberme() {
return rememberme;
}
public void setrememberme(boolean rememberme) {
this.rememberme = rememberme;
}
public string getloginname() {
return loginname;
}
public void setloginname(string loginname) {
this.loginname = loginname;
}
public string getpassword() {
return password;
}
public void setpassword(string password) {
this.password = password;
}
public string login()throws exception{
try {
user user = userdao.attemptlogin(loginname, password);
if (rememberme){
cookie cookie = new cookie(logininterceptor.cookie_rememberme_key, user.getloginname() "==" user.getpassword());
cookie.setmaxage(60 * 60 * 24 * 14);
response.addcookie(cookie);
}
session.put(logininterceptor.user_session_key, user);
string goingtourl = (string) session.get(logininterceptor.going_to_url_key);
if (stringutils.isnotblank(goingtourl)){
setgoingto;
session.remove(logininterceptor.going_to_url_key);
}else{
setgoingto;
}
return success;
} catch (usernotfoundexception e) {
addactionmessage("user name or password is not corrected.");
return input;
}
}
public userdao getuserdao() {
return userdao;
}
public void setuserdao(userdao userdao) {
this.userdao = userdao;
}
public void setservletresponse(httpservletresponse response) {
this.response = response;
}
public void setservletrequest(httpservletrequest request) {
this.request = request;
}
public void setsession(map session) {
this.session = session;
}
public void setcookiesmap(map cookies) {
this.cookies = cookies;
}
}
差不多就是这么多代码了。最后看看logoutaction
java代码
1.package com.javaeye.dengyin2000.wallet.actions;
2.
3.import javax.servlet.http.cookie;
4.import javax.servlet.http.httpservletrequest;
5.import javax.servlet.http.httpservletresponse;
6.import javax.servlet.http.httpsession;
7.
8.import org.apache.struts2.interceptor.servletrequestaware;
9.import org.apache.struts2.interceptor.servletresponseaware;
10.
11.import com.javaeye.dengyin2000.wallet.interceptor.logininterceptor;
12.import com.opensymphony.xwork2.actionsupport;
13.
14.public class logoutaction extends actionsupport implements servletrequestaware , servletresponseaware{
15.
16. private httpservletrequest request;
17. private httpservletresponse response;
18.
19. public string execute() throws exception{
20. httpsession session = request.getsession(false);
21. if (session!=null)
22. session.removeattribute(logininterceptor.user_session_key);
23.
24. cookie[] cookies = request.getcookies();
25. if (cookies!=null) {
26. for (cookie cookie : cookies) {
27. if (logininterceptor.cookie_rememberme_key.equals(cookie
28. .getname())) {
29. cookie.setvalue("");
30. cookie.setmaxage(0);
31. response.addcookie(cookie);
32. return "login";
33. }
34. }
35. }
36. return "login";
37. }
38.
39. public void setservletrequest(httpservletrequest request) {
40. this.request = request;
41. }
42.
43. public void setservletresponse(httpservletresponse response) {
44. this.response = response;
45. }
46.
47.}
package com.javaeye.dengyin2000.wallet.actions;
import javax.servlet.http.cookie;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.http.httpsession;
import org.apache.struts2.interceptor.servletrequestaware;
import org.apache.struts2.interceptor.servletresponseaware;
import com.javaeye.dengyin2000.wallet.interceptor.logininterceptor;
import com.opensymphony.xwork2.actionsupport;
public class logoutaction extends actionsupport implements servletrequestaware , servletresponseaware{
private httpservletrequest request;
private httpservletresponse response;
public string execute() throws exception{
httpsession session = request.getsession(false);
if (session!=null)
session.removeattribute(logininterceptor.user_session_key);
cookie[] cookies = request.getcookies();
if (cookies!=null) {
for (cookie cookie : cookies) {
if (logininterceptor.cookie_rememberme_key.equals(cookie
.getname())) {
cookie.setvalue("");
cookie.setmaxage(0);
response.addcookie(cookie);
return "login";
}
}
}
return "login";
}
public void setservletrequest(httpservletrequest request) {
this.request = request;
}
public void setservletresponse(httpservletresponse response) {
this.response = response;
}
}
这里需要注意的是需要把cookie也清理下。
applicationcontext-struts.xml
java代码
1.
2.
3. "-//spring//dtd bean//en"
4. "http://www.springframework.org/dtd/spring-beans.dtd">
5.
6.
7.
8.
10.
11.
13.
14.
15.
16.
17.
18.
19.
20.
22.
23.
24.
25.
26.
"-//spring//dtd bean//en"
"http://www.springframework.org/dtd/spring-beans.dtd">
我想问一下,那个cookie为什么要存为
["wallet.cookie.rememberme" : "username==password"]的形式?
直接存为["username" : "password"]不是更方便吗?
服务器好像会根据域名只拿它自己写到客户端的cookie吧?
这个没有关系。你想怎么存就怎么存,只要你能拿到username 和password
出于安全考虑,不应该把密码这种敏感数据保存在客户端cookie
我现在做的项目也是用cookie的方式来实现单点登录(有多个应用集群)是记住cookie的session值,再将这个值放到数据库中的方式来实现的。如果将用户名密码放到cookie中的确存在安全隐患。我这里只是举例而已。你可以不用把密码保存在cookie中。你只记住用户名就是了。下次登入的时候直接用用户名到数据库里找到用户信息 不用匹配密码。
struts2的interceptor是非常有用的!
gotourl算法感觉有点问题,只能是/namespace/actionname.action形式,应该直接取浏览器的url地址才对。 用户名和加密后的密码可以保存在cookie里面,认证的时候,直接通过加密的密码来认证,如果有sso的话,只要做比较方便。
我保存cookie
cookiename为xxx
cookievalue为admin==123
在用拦截器读cookie时,只能得到名字xxx的cookie的cookievalue 只有admin
没有了“==123”
请问怎么回事?
拦截器是不是一定要写配置文件啊!
我的项目使用零配置文件方式运行的好像不行的!
不知道有没有好的建议!
实现认证/授权/rememberme/sso等功能的话,不如用acegi,不用写代码,全部xml配置
我用aop作自动代理的时候,现在拦截action的时候老是拦截不到,拦截service没问题。action我是用delegatingactionproxy代理,在aop配置中也设置了
true和
金沙集团3354.c.cav-老版金沙app下载客户手机端