struts2 拦截器实现登录权限控制

使用struts2的拦截器实现简单的登录权限拦截,非常简单。

首先在登录action给session设置username或者其他表示登录用户的值,作为在拦截器中判断是否登录的根据。

比如我的loginAction,重点是session.put("username", thisUser.getUsername());在session中这是一个username的值为当前登录用户的用户名。只要在拦截器中判断session中的username是否为空就可以判断是否登录了。

public String login() throws Exception {
        //查出数据库中此用户
        User thisUser = (User) beanDao.getBean(user);
        if(thisUser != null)
        {
            String md5Pass = Md5Util.getMD5Str(user.getPassword());
            if (md5Pass.equals(thisUser.getPassword())) {
                session.put("username", thisUser.getUsername());
                session.put("id", thisUser.getId());
                return SUCCESS;
            } else {
                addActionMessage("密码错误!");
                return ERROR;
            }
        } else {
            addActionMessage("该用户未注册!");
            return ERROR;
        }
    }

然后编写拦截器,在这里如果用户没有登录返回一个Action.LOGIN,它是struts中预置的一个字符串即“login”,如同ERROR值为error一样,所以你可以返回任何你自定义的逻辑视图名。

...
public class LoginInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        ActionContext ctx = actionInvocation.getInvocationContext();
        Map session = ctx.getSession();
        String user = (String) session.get("username");
        //登录名不为空则为已登录
        if (user != null) {
            //执行原Action
            return actionInvocation.invoke();
        }
        ctx.put("tip", "请先登录");
        return Action.LOGIN;
    }
}

因为用户未登录时拦截器返回login(即Action.LOGIN的值),所以需要在action中定义一个名为login的result,最好定义为全局rsult,如下

        <global-results>
            <result name="login">index.jsp</result>
        </global-results>

至于这个全局result在哪个包中,需要根据你的拦截范围确定,可以放在父级包中被继承,需要登录验证的放在一个继承自它所在包的包中,不需要拦截的action所在的包不要继承这个包。

 

然后就要在xml中注册拦截器了,在每个action中都引用这个拦截器不符合代码复用,所以定义成一个拦截器栈,然后在需要拦截的包中经这个栈定义为默认拦截器就可以了,这里需要注意的是,最好将默认的拦截器栈 defaultStack定义在你的拦截器后面,因为有一些像输入校验的拦截器在这个默认拦截器栈用,而struts2的拦截器执行顺序又取决于你的注册顺序,所以那些进行输入校验的视图会首先执行输入校验拦截器,它会提前返回input退出,而不是你希望的自定义拦截器中的结果,因为它根本在后面没有执行,所以最好放在defaultStack之前

<interceptors>
    <interceptor name="loginJudge" class="com.hims.interceptor.LoginInterceptor">                        </interceptor>
    <!--定义默认拦截器栈-->
    <interceptor-stack name="himsDefault">
       <interceptor-ref name="loginJudge"></interceptor-ref>
       <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
</interceptors>

在需要拦截的包中

    <package name="page" namespace="/" extends="default">
        <!--使用默认拦截器栈-->
        <default-interceptor-ref name="himsDefault"></default-interceptor-ref>
        ...
    </package>

这样便可以实现简单的登录拦截了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2 中,可以使用拦截器实现权限控制。具体来说,可以编写一个自定义的拦截器,然后在 struts.xml 配置文件中将其配置为需要进行权限控制的 Action 的拦截器。以下是一个简单的权限拦截器示例: ```java public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 获取当前用户 User user = (User) ActionContext.getContext().getSession().get("user"); // 判断用户是否拥有权限 if (user != null && user.hasPermission(invocation.getInvocationContext().getName())) { // 如果有权限,则继续执行 Action return invocation.invoke(); } else { // 如果没有权限,则跳转到错误页面 return "error"; } } } ``` 在上述代码中,我们首先获取了当前用户,然后判断用户是否拥有执行当前 Action 的权限。如果有权限,则继续执行 Action;否则,跳转到错误页面。 接下来,在 struts.xml 配置文件中,我们可以将该拦截器配置为需要进行权限控制的 Action 的拦截器,如下所示: ```xml <action name="myAction" class="com.example.MyAction"> <interceptor-ref name="authInterceptor"/> <result name="success">/myAction.jsp</result> <result name="error">/error.jsp</result> </action> <interceptor-stack name="authStack"> <interceptor-ref name="authInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> <interceptors> <interceptor name="authInterceptor" class="com.example.AuthInterceptor"/> </interceptors> ``` 在上述代码中,我们首先定义了一个名为 authStack 的拦截器栈,该拦截器栈包含了 authInterceptor 和 defaultStack 两个拦截器。然后,我们将 myAction Action 配置为使用 authStack 拦截器栈。最后,我们定义了一个名为 authInterceptor 的拦截器,并将其添加到了 interceptors 中。 这样一来,当用户访问 myAction Action 时,就会先执行 authInterceptor 拦截器,进行权限控制,然后再执行 defaultStack 拦截器栈中的其它拦截器。如果 authInterceptor 拦截器返回了 error,则会跳转到 error.jsp 页面;否则,会跳转到 myAction.jsp 页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值