在​s​t​r​u​t​s​2​中​使​用​拦​截​器​(​I​n​t​e​r​c​e​p​t​o​r​)​控​制​登​录​和​权​限

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;  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值