在
jsp servlet
中我们通常使用
Servlet Filter
控制用户是否登入,
是否有权限转到某个页面。
在
struts2
中我们应该会想到他的拦截器(
Interceptor
),
Interceptor
在
struts2
中起着非
常重要的作用。
很多
struts2
中的功能都是使用
Interceptor
实现的。
需求:简单的登入界面,让用户输入用户名、密码、记住密码(
remember me
)。
如果用
户选中
remember me
的话,
下次就不需要再登入了
(使用
cookie
实现,
用需要点击
logout
取消
remeber me
功能)。
如果用户起始输入的地址不是登入页面的话,在用户登入之后
需要转到用户输入的起始地址。
我们先看看
LoginInterceptor.java
Java
代码
1.
package
com.javaeye.dengyin2000.wallet.interceptor;
2.
3.
import
java.util.Map;
4.
5.
import
javax.servlet.http.Cookie;
6.
import
javax.servlet.http.HttpServletRequest;
7.
8.
import
org.apache.commons.lang.StringUtils;
9.
import
org.apache.struts2.StrutsStatics;
10.
11.
import
com.javaeye.dengyin2000.wallet.dao.UserDAO;
12.
import
com.javaeye.dengyin2000.wallet.dao.UserNotFoundException;
13.
import
com.javaeye.dengyin2000.wallet.domains.User;
14.
import
com.opensymphony.xwork2.ActionContext;
15.
import
com.opensymphony.xwork2.ActionInvocation;
16.
import
com.opensymphony.xwork2.interceptor.AbstractInterceptor;
17.
18.
public
class
LoginInterceptor
extends
AbstractInterceptor {
19.
public
static
final
String USER_SESSION_KEY=
"wallet.session.user"
;
20.
public
static
final
String COOKIE_REMEMBERME_KEY=
"wallet.cookie.remember
me"
;
21.
public
static
final
String GOING_TO_URL_KEY=
"GOING_TO"
;
22.
23.
private
UserDAO userDao;
24.
25.
@Override
26.
public
String intercept(ActionInvocation invocation)
throws
Exceptio
n {
27.
28.
ActionContext actionContext = invocation.getInvocationContext();
29.
HttpServletRequest request= (HttpServletRequest) actionContext.get(S
trutsStatics.HTTP_REQUEST);
30.
31.
Map session = actionContext.getSession();
32.
if
(session !=
null
&& session.get(USER_SESSION_KEY) !=
null
){
33.
return
invocation.invoke();
34.
}
35.
36.
Cookie[] cookies = request.getCookies();
37.
if
(cookies!=
null
) {
38.
for
(Cookie cookie : cookies) {
39.
if
(COOKIE_REMEMBERME_KEY.equals(cookie.getName())) {
40.
String value = cookie.getValue();
41.
if
(StringUtils.isNotBlank(value)) {
42.
String[] split = value.split(
"=="
);
43.
String userName = split[
0
];
44.
String password = split[
1
];
45.
try
{
46.
User user = userDao
47.
.attemptLogin(userName, password);
48.
session.put(USER_SESSION_KEY, user);
49.
}
catch
(UserNotFoundException e) {
50.
setGoingToURL(session, invocation);
51.
return
"login"
;
52.
}
53.
}
else
{
54.
setGoingToURL(session, invocation);
55.
return
"login"
;
56.
}
57.
return
invocation.invoke();
58.
}
59.
}
60.
}
61.
setGoingToURL(session, invocation);
62.
return
"login"
;
63.
}
64.
65.
private
void
setGoingToURL(Map session, ActionInvocation invocation){
66.
String url =
""
;
67.
String namespace = invocation.getProxy().getNamespace();
68.
if
(StringUtils.isNotBlank(namespace) && !namespace.equals(
"/"
)){
69.
url = url + namespace;
70.
}
71.
String actionName = invocation.getProxy().getActionName();
72.
if
(StringUtils.isNotBlank(actionName)){
73.
url = url +
"/"
+ actionName +
".action"
;
74.
}
75.
session.put(GOING_TO_URL_KEY, url);
76.
}
77.
78.
public
UserDAO getUserDao() {
79.
return
userDao;
80.
}
81.
82.
public
void
setUserDao(UserDAO userDao) {
83.
this
.userDao = userDao;
84.
}
85.
86.
}
首先判断
session
中有没有用户信息,
如果有的话继续,
如果没有的话,检查
cookie
中
有没有
rememberme
的值,如果有的话,用
==
分割,
取得用户名密码进行登入。如果没
有这个用户的话,记录下
request
的
action
地址然后转到登入页面。如果验证有这个用户,
则继续下面的
interceptor
。
如果
cookie
中没有信息的话,
则记录
request
的
action
地址然
后转到登入页面。
以上就是
LoginInterceptor
的全部代码。
下面我们看看
struts.xml
Java
代码
1.
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
2.
3.
<!DOCTYPE struts PUBLIC
4.
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
5.
"http://struts.apache.org/dtds/struts-2.0.dtd"
>
6.
7.
<struts>
8.
<
package
name=
"default"
extends
=
"struts-default"
>
9.
<interceptors>
10.
<interceptor name=
"loginInterceptor"
class
=
"loginInterceptor"
></
interceptor>
11.
<interceptor-stack name=
"loginDefaultStack"
>
12.
<interceptor-ref name=
"loginInterceptor"
></interceptor-re
f>
13.
<interceptor-ref name=
"defaultStack"
></interceptor-ref>
14.
</interceptor-stack>
15.
</interceptors>
16.
<
default
-interceptor-ref name=
"loginDefaultStack"
></
default
-intercep
tor-ref>
17.
<global-results>
18.
<result name=
"login"
type=
"redirect"
>/login.jsp</result>
19.
</global-results>
20.
<action name=
"index"
class
=
"indexAction"
>
21.
<result>/index.jsp</result>
22.
</action>
23.
<action name=
"logout"
class
=
"logoutAction"
></action>
24.
25.
<action name=
"login"
class
=
"loginAction"
method=
"login"
>
26.
<result type=
"redirect"
>${goingToURL}</result>
27.
<result name=
"input"
>/login.jsp</result>
28.
<interceptor-ref name=
"defaultStack"
></interceptor-ref>
29.
</action>
30.
31.
<action name=
"register"
class
=
"registerAction"
>
32.
<result type=
"redirect"
>/login.jsp</result>
33.
<result name=
"input"
>/register.jsp</result>
34.
<interceptor-ref name=
"defaultStack"
></interceptor-ref>
35.
</action>
36.
</
package
>
37.
</struts>
我们是使用的默认的
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.
<html>
5.
<head>
6.
<meta http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
>
7.
<title>Wallet-Login</title>
8.
</head>
9.
<body>
10.
<h2>Login</h2>
11.
<s:actionmessage/>
12.
<s:actionerror/>
13.
<s:form action=
"login"
method=
"post"
validate=
"false"
theme=
"xhtml"
>
14.
<s:textfield name=
"loginName"
label=
"Username"
></s:textfield><br/>
15.
<s:password name=
"password"
label=
"Password"
></s:password><br/>
16.
<s:checkbox label=
"Remember Me"
name=
"rememberMe"
></s:checkbox>
17.
<s:submit value=
"%{'Login'}"
></s:submit>
18.
</s:form>
19.
<a href=
"register.jsp"
>Register</a>
20.
</body>
21.
</html>
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
ServletResponseAwa
re, 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;