Struts2自定义拦截器实现权限控制实例(非常详细) 图片看不了?点击切换HTTP 返回上层
网上购物对于人们并不陌生,当人们浏览购物网站,看中某个商品并选择购买后,如果之前用户没有登录该网站,则页面会跳转到登录页面并提示用户尚未登录;如果用户已登录并单击购买商品时,则会跳转到支付(或结算)页面中进行后续操作。
在上述需求中,对未登录用户的权限控制就可以通过拦截器实现。下面编写案例模拟购物网站流程,要求使用 Struts2 的拦截器实现对用户的权限控制。
在 User 类中,定义了 username 和 password 两个属性,以及其 getter 和 setter 方法。
2)创建商品 Action。在 com.mengma.action 包下创建 BookAction 类,编辑后如下所示。
下面就按照上述步骤创建拦截器。
1)创建拦截器类。在 src 目录下创建一个名称为 com.mengma.interceptor 的包,在该包下创建一个名称为 PrivilegeInterceptor.java 的文件,如下所示。
2)配置 struts.xml 文件。在 src 目录下创建 struts.xml 文件,此文件用于声明自定义拦截器、拦截器栈以及对 book 操作的 Action,其代码如下所示。
在 struts.xml 中,首先声明了一个名称为 privilege 的拦截器,并将该拦截器放入自定义的拦截器栈 myStack 中;然后配置了用户登录的 action 信息;最后定义了关于对页面 book 操作的 action 信息,并在该 action 中引用自定义的拦截器栈 myStack。
登录页面 login.jsp 的代码如下所示。
操作成功页面 success.jsp 的代码如下所示。

图 1 主页
当单击购买链接后,页面将跳转到登录页面中,并提示用户登录,如图 2 所示。

图 2 登录页面
如果输入错误的用户名和密码,将提示用户名或密码错误信息,如图 3 所示。

图 3 登录页面
当输入正确的用户名和密码并登录成功后,会再次跳转到主页,此时如果单击购买链接,将提示用户已经成功购买商品,如图 4 所示。

图 4 成功页面
在上述需求中,对未登录用户的权限控制就可以通过拦截器实现。下面编写案例模拟购物网站流程,要求使用 Struts2 的拦截器实现对用户的权限控制。
1. 创建项目
在 MyEclipse 中创建一个 Web 项目 struts2Demo03,将 Struts2 框架所需的 JAR 包添加到项目 WEB-INF 目录下的 lib 文件夹中,并发布到类路径下。2. 配置 web.xml 文件
在 web.xml 文件中配置过滤器和首页信息,其配置代码如下所示。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version= "1.0" encoding= "UTF-8" ?> <web-app xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns= "http://java.sun.com/xml/ns/javaee" xmlns:web= "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id= "WebApp_ID" version= "3.0" > <! -- 定义filter --> <filter> <! -- filter名字 --> <filter- name >struts2</filter- name > <! -- filter的实现类,此处是Struts2的核心过滤器 --> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <! -- filter的名字,必须是filter元素中已经声明过的过滤器的名字 --> <filter- name >struts2</filter- name > <! -- 定义filter负责拦截的URL地址 --> <url-pattern>/*</url-pattern> </filter-mapping> <! -- 首页 --> <welcome-file-list> <welcome-file>main.jsp</welcome-file> </welcome-file-list> </web-app> |
3. 创建用户实体类
在 src 目录下创建一个名为 com.mengma.domain 的包,在该包下创建 User 类,如下所示。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package com.mengma.domain; public class User { private String username; // 用户名 private String password ; // 密码 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password ; } public void setPassword(String password ) { this. password = password ; } } |
4. 创建 Action
1)创建登录 Action。在 src 目录下创建包 com.mengma.action,在该包下创建 LoginAction 类,编辑后如下所示。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.mengma. action ; import com.mengma.domain. User ; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public class LoginAction extends ActionSupport implements ModelDriven< User > { private static final long serialVersionUID = -8493698886438630994L; private User user = new User (); @Override public User getModel() { return user ; } public String execute () throws Exception { // 获取ActionContext ActionContext actionContext = ActionContext.getContext(); if ( "admin" .equals( user .getUsername()) && "123456" .equals( user .getPassword())) { // 将用户存储在session中 actionContext.getSession().put( "user" , user ); return SUCCESS; } else { actionContext.put( "msg" , "用户名或密码错误,请重新登录!" ); return INPUT; } } } |
1 2 3 4 5 6 7 8 9 10 | package com.mengma. action ; import com.opensymphony.xwork2.ActionSupport; public class BookAction extends ActionSupport { private static final long serialVersionUID = 5640989517690867879L; // 购买图书 public String buy() { return SUCCESS; } } |
5. 创建拦截器
通过之前对拦截器的学习,可以将自定义拦截器的使用过程分为以下三步。- 用户自定义的拦截器类,必须实现 Interceptor 接口或继承 AbstractInterceptor 类。
- 需要在 Struts.xml 中定义自定义的拦截器。
- 在 Struts.xml 中的 Action 中使用拦截器。
下面就按照上述步骤创建拦截器。
1)创建拦截器类。在 src 目录下创建一个名称为 com.mengma.interceptor 的包,在该包下创建一个名称为 PrivilegeInterceptor.java 的文件,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.mengma.interceptor; import com.opensymphony.xwork2. Action ; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class PrivilegeInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 193664972753450682L; @Override public String intercept(ActionInvocation invocation) throws Exception { // 得到 ActionContext ActionContext actionContext = invocation.getInvocationContext(); // 获取 User 对象 Object user = actionContext.getSession().get( "user" ); if ( user != null ) { return invocation.invoke(); // 继续向下执行 } else { actionContext.put( "msg" , "您还未登录,请先登录!" ); return Action .LOGIN; // 如果用户不存在,则返回login值 } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" > <struts> <package name = "struts2" namespace= "/" extends= "struts-default" > <! -- 声明拦截器 --> <interceptors> <interceptor name = "privilege" class= "com.mengma.interceptor.PrivilegeInterceptor" /> <interceptor-stack name = "myStack" > <interceptor-ref name = "defaultStak" /> <interceptor-ref name = "privilege" /> </interceptor-stack> </interceptors> <! -- 用户登录操作 --> < action name = "login" class= "com.mengma.action.LoginAction" > <result>/main.jsp</result> <result name = "input" >/login.jsp</result> </ action > <! -- 关于book操作 --> < action name = "book_*" class= "com.mengma.action.BookAction" method= "{1}" > <result>/success.jsp</result> <result name = "login" >/login.jsp</result> <! -- 在action中使用自定义拦截器 --> <interceptor-ref name = "myStack" /> </ action > </package> </struts> |
6. 创建显示页面
在 WebContent 目录下创建三个视图页面,分别为主页 main.jsp、登录页面 login.jsp 和操作成功页面 success.jsp。其中主页 main.jsp 的代码如下所示。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <%@ page language= "java" contentType= "text/html; charset=utf-8" pageEncoding= "utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" > <title>主页</title> </head> <body> < table border= "0" > <tr> <td>《SSH框架整合实战教程》</td> <td><a href= "/struts2Demo03/book_buy" >购买</a></td> </tr> </ table > </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <%@ page language= "java" contentType= "text/html; charset=utf-8" pageEncoding= "utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <title>登录</title> <style type= "text/css" > input[type=text],input[type= password ]{width:150px} </style> </head> <body> <div align= "center" > <form action = "/struts2Demo03/login.action" method= "post" > < table > <tr> <td><label style= "text-align:right;" >用戶名:</label></td> <td><input type= "text" name = "username" ></td> <td><span style= "color:#F00" >${requestScope.msg }</span></td> </tr> <tr> <td><label style= "text-align:right;" >密 码:</label></td> <td><input type= "password" name = "password" ></td> </tr> <tr> <td align= "right" colspan= "2" ><input type= "submit" value= "登录" ></td> </tr> </ table > </form> </div> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 | <%@ page language= "java" contentType= "text/html; charset=utf-8" pageEncoding= "utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <title>成功页面</title> </head> <body> 尊敬的会员${ user .username },您已成功购买商品,祝您购物愉快! </body> </html> |
7. 运行项目并查看结果
启动 struts2Demo03 项目,在浏览器的地址栏中输入地址 http://localhost:8080/struts2Demo03/main.jsp 访问其主页,浏览器的显示结果如图 1 所示。
图 1 主页
当单击购买链接后,页面将跳转到登录页面中,并提示用户登录,如图 2 所示。

图 2 登录页面
如果输入错误的用户名和密码,将提示用户名或密码错误信息,如图 3 所示。

图 3 登录页面
当输入正确的用户名和密码并登录成功后,会再次跳转到主页,此时如果单击购买链接,将提示用户已经成功购买商品,如图 4 所示。

图 4 成功页面