您的位置:首页 > 编程语言 > Java开发

Struts2登录拦截器的使用

2017-12-12 22:05 363 查看
        在没有了解拦截器之前一直有一个困惑,就是很多网站上面在没有使用账号登录的时候,一部分页面的是访问不了的(无权访问)。知道拦截器且了解了拦截器之后,恍然大悟,原来使用一个拦截器进行判断是否有用户登录,拦截设置就可实现这一功能。

        下面是一个简单的示例:

    我们写的是基于Struts2框架的拦截器,所以新建项目后要先搭建Struts2框架。

    Struts2框架搭建步骤点击链接:Struts2框架搭建详解

1、新建一个interceptor包,创建拦截器类(示例类命名:MyInterceptor),让其实现Interceptor接口

示例代码如下:

package com.aaa.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
* @Discription
* @author ***
* @company ***
* @date 2017-12-12
**/
public class MyInterceptor implements Interceptor {

public void destroy() {

}

public void init() {

}

public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
Object object = session.get("admin"); // 判断用户是否登录
if(object==null){
context.put("msg", "无权访问!"); // 无登录则拦截并返回error信息
return "error";
}
String invoke = invocation.invoke(); // 登录则放行
return invoke;
}

}2、配置struts.xml中的拦截器及拦截器栈
示例代码如下:

<!-- 拦截器 -->
<interceptors>
<!-- 注册拦截器 -->
<interceptor name="myInterceptor" class="com.aaa.interceptor.MyInterceptor" />
<!-- 注册拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
3、新建action包,创建登录类

示例代码如下:

package com.aaa.action;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;

/**
* @Discription
* @author ***
* @company ***
* @date 2017-12-12
**/
public class LoginAction {
/**
* 访问方法
* */
public String execute(){
ActionContext context = ActionContext.getContext();
context.put("msg", "访问成功!");
return "success";
}

/**
* 登录方法
* */
public String login(){
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
context.put("msg", "登录成功!");
session.put("admin", "admin");
return "login";
}

/**
* 退出方法
* */
public String exit(){
ActionContext context = ActionContext.getContext();
context.put("msg", "退出成功!");
Map<String, Object> session = context.getSession();
session.remove("admin");
return "exit";
}
}
4、对struts.xml进行action配置
示例代码如下:

<!-- 全局拦截器栈 -->
<default-interceptor-ref name="myStack"/>
<!-- 全局返回结果 -->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<!-- 访问资源 -->
<action name="login" class="com.aaa.action.LoginAction">
<result>/success.jsp</result>
</action>
<!-- 登录action -->
<action name="grant_*" class="com.aaa.action.LoginAction" method="{1}">
<result name="login">/login.jsp</result>
<result name="exit">/exit.jsp</result>
<interceptor-ref name="defaultStack"/>
</action>

示例jsp页面省略...
示例效果如下图所示:当登录成功时才能访问,当退出登录时则无权访问。



总结:

(1)新建拦截器类实现Interceptor接口,其导入包名为:import com.opensymphony.xwork2.interceptor.Interceptor;

(2)重要的是struts.xml文件中的拦截器配置,我们新建自己的拦截器后,struts2默认的20个拦截器就会被覆盖,所以我们最好的解决办法是注册拦截器栈,把我们自定义的登录拦截器和默认的20个拦截器放在一起,且定义全局拦截器栈,使得在登录的action中使用defaultStack即可;那么当用户没有登录的时候,不止只是单个的页面不能访问,而是一部分都不能访问,所以我们最好的解决办法是配置全局返回结果,即可解决代码重复且麻烦的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息