Struts 是 Apache 软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta 项目中的一个子项目,并在 2004 年 3 月成为 ASF 的顶级项目。它通过采用 JavaServlet/JSP 技术,实现了基于 Java EEweb 应用的 MVC 设计模式的应用框架,是 MVC 经典设计模式中的一个经典产品。
本篇文章主要介绍了 struts2 如何使用拦截器进行用户权限控制实例,非常具有实用价值,需要的朋友可以参考下
大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对 VIP 开放等等,这些权限的控制都可以用 struts2 中的拦截器来实现。
下面通过一个简单的 Demo 来模拟这种用户权限控制的实现流程,设定三种不同身份的用户,commen 为普通用户,VIP 为会员用户,还有一种 admin 为管理员。
先看一下 Demo 的整体结构:
首先搭建 struts2 框架的开发环境(前面博客中有介绍),环境搭建完之后又再看一看如何配置 struts.xml:
- xml version="1.0" encoding="UTF-8" ?>
- "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
- "http://struts.apache.org/dtds/struts-2.3.dtd">
- name="hello" extends="struts-default" namespace="/">
- name="testInterceptor" class="org.interceptor.InterceptorTest">
- name="testStack">
- name="testInterceptor" />
- name="defaultStack" />
- name="error">/Error.jsp
- name="login" class="org.interceptor.LoginAction">
- /WEB-INF/pages/index.jsp
- name="admin" class="org.interceptor.LoginAction" method="AdminExecute">
- name="testStack">
- /WEB-INF/pages/admin.jsp
- name="vip" class="org.interceptor.LoginAction" method="vipExecute">
- name="testStack">
- /WEB-INF/pages/vipUser.jsp
- name="commen" class="org.interceptor.LoginAction" method="commenExecute">
- name="testStack">
- /WEB-INF/pages/commen.jsp
其中,
Action 类,不做处理,全部放行,让拦截器处理:
- public class LoginAction implements SessionAware {@SuppressWarnings("unused") private String username;
- private Map < String,
- Object > session;
- public void setUsername(String username) {
- this.username = username;
- session.put("username", username);
- }
- public void setSession(Map < String, Object > session) {
- // TODO Auto-generated method stub
- this.session = session;
- }
- public String AdminExecute() {
- return "success";
- }
- public String vipExecute() {
- return "success";
- }
- public String commenExecute() {
- return "success";
- }
- public String execute() {
- return "success";
- }
- }
Inteceptor(拦截器类):
- public class LoginAction implements SessionAware {@SuppressWarnings("unused") private String username;
- private Map < String,
- Object > session;
- public void setUsername(String username) {
- this.username = username;
- session.put("username", username);
- }
- public void setSession(Map < String, Object > session) {
- // TODO Auto-generated method stub
- this.session = session;
- }
- public String AdminExecute() {
- return "success";
- }
- public String vipExecute() {
- return "success";
- }
- public String commenExecute() {
- return "success";
- }
- public String execute() {
- return "success";
- }
- }
只是 模拟拦截器的实现思路,没有持久层的数据,这里的方法是使用 invocation.getProxy().getActionName() 方法来获取 struts.xml 中配置的 action 名称,和用户表单提交的名称做对比,如果输入的用户名是以 action 名开头的,就放行,否则拦截。
登录 jsp:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
- <% String path=r equest.getContextPath(); String basePath=r equest.getScheme()+
- "://"+request.getServerName()+ ":"+request.getServerPort()+path+ "/"; %>
- <%=basePath%>" rel="external nofollow" rel="external nofollow">
- login
- action="login.action">
- type="text" name="username" />
- type="password" name="password" />
- type="submit" value="login">
拦截后跳转页:
- 你的权限不足,请先升级权限...
访问资源代码:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <%=basePath%>" rel="external nofollow" rel="external nofollow" >
- index
- href="admin.action" rel="external nofollow" >admin
- href="vip.action" rel="external nofollow" >vip
- href="commen.action" rel="external nofollow" >commen
其余 admin.jsp 等界面没有内容,只是为了区分实现跳转页面不同。
运行结果:
使用 commen 角色登录:
点击 VIP 以及 admin 跳转链接时:
来源: http://www.phperz.com/article/17/1207/357113.html