在做web项目的时候肯定需要做登陆验证等权限的管理,如果不经过登陆就要使用相应的权限是不可以的。所以需要用到拦截器,拦截器的功能在struts2中已经集成,当然也可以在Spring中使用,这就会在后来写Spring博客的时候再写了。
接下来,我们做一个登陆验证,未登陆不能够访问一些方法:
首先,我们创建一个web项目,并且配置一些Struts2的jar包和web.xml文件,这两个就不多说了。
我们首先写一个登陆获得session的界面:index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% request.getSession().setAttribute("user", "itcast"); %> 用户已经登陆
在这个界面,我们假设用户已经登陆,并且设置了一个session
我们还要写一个退出登陆的界面:remove.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% request.getSession().removeAttribute("user"); %> 用户已经退出
在这个界面,我们注销了session(也不能说是注销,因为我们只是把user这个属性移除了)
然后,我们需要配置下struts.xml文件了,这里是最重要的一步:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <!-- 指定Struts 2配置文件的根元素 --> <struts> <package name="employee" namespace="/control/employee" extends="struts-default"> <interceptors> <interceptor name="permission" class="cn.interceptor.PermissionInterceptor"></interceptor> <interceptor-stack name="permissionStack"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="permission" /> </interceptor-stack> </interceptors> <global-results> <result name="message">/WEB-INF/message.jsp</result> </global-results> <action name="list_*" class="cn.com.HelloWorldAction" method="{1}"> <interceptor-ref name="permissionStack" /> </action> </package> </struts>
1、<interceptors></interceptors>标签,这是定义interceptors的
2、<interceptor name="permission" class="cn.interceptor.PermissionInterceptor"></interceptor>这里定义了一个interceptor,name是permission,拦截器类是PermissionInterceptor,这个类是我们自己定义的
3、<interceptor-stack name="psermissionStack"></interceptor-stack>这是定义了一个拦截器栈。如果我们为某个action设置了单个的自定义的interceptor,将会导致Struts2的一些核心拦截器失效,所以我们需要定义一个拦截器栈,把<interceptor-ref name="defaultStack">这个Struts2的默认拦截器栈添加进去,并且放在栈顶,然后再添加进去我们自定义的拦截器:<interceptor-ref name="permission
/>。这样子我们就可以在<action>中添加进去一个拦截器栈,而不是单一的一个拦截器。
4、<global-results>这是定义了一个全局的result视图
5、<action></action>可以看到我们在这个action插入了一个标签<interceptor-ref name="permissionStack" />这就是把我们上边定义的拦截器栈加入了进去。
在我们的struts.xml配置完成之后,我们需要写一个拦截器类了:PermissionInterceptor.java,该类扩展了com.opensymphony.xwork2.interceptor.Interceptor接口
package cn.interceptor; import java.util.Map; import javax.interceptor.InvocationContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class PermissionInterceptor implements Interceptor { @Override public void destroy() { } @Override public void init() { } @Override public String intercept(ActionInvocation actionInvocation) throws Exception { Object user = ActionContext.getContext().getSession().get("user"); if(user!=null){ return actionInvocation.invoke(); } ActionContext.getContext().put("message", "你没有权限执行该操作"); return "message"; } }
在这个接口中,有三个方法,分别是销毁、初始化、还有具体的intercept的操作:
在intercept()方法中:我们首先通过ActionContext对象获得了user对象,如果user对象不为空(登陆),则我们return actionInvocation.invoke(),拦截器栈中后续的拦截器继续执行,等到拦截器执行完之后,action中调用的方法就开始执行了。如果对象为空,我们设置message,并且返回message视图。
接下来,我们要给action定义相应的逻辑处理类:
package cn.com; public class HelloWorldAction { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String addUI(){ this.message="addUI"; return "message"; } public String execute() throws Exception{ this.message="execute"; return "message"; } }
在上边调用拦截器之后,如果我们return actionInvocation.invoke(),则我们会执行这个逻辑类中相应的方法,如果我们调用了execute()方法,我们会执行这个方法中的逻辑处理,然后,返回message视图。
然后,我们来写一下message对应的视图:message.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% String user = (String)request.getSession().getAttribute("user"); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'message.jsp' starting page</title> </head> <body> ${message } <%=user %> </body> </html>
这是我们项目的工程目录:
如果我们首先输入:http://localhost:8080/test/control/employee/list_execute.action,这是要访问execute()方法,在页面中会打印出:你没有权限执行该操作 null
如果我们输入:http://localhost:8080/test/index.jsp,页面上会打印出:用户已经登陆
然后,我们再输入:http://localhost:8080/test/control/employee/list_execute.action,页面上会打印出:execute itcast
可以看出来,我们的拦截器起作用了:在不登陆的情况下,我们不能够访问相应的方法