struts2如何使用拦截器进行用户权限控制

栏目: Struts · 发布时间: 8年前

内容简介:struts2如何使用拦截器进行用户权限控制

大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现。下面通过一个简单的Demo来模拟这种用户权限控制的实现流程,设定三种不同身份的用户,commen为普通用户,VIP为会员用户,还有一种admin为管理员。

先看一下Demo的整体结构:

struts2如何使用拦截器进行用户权限控制

首先搭建struts2框架的开发环境(前面博客中有介绍),环境搭建完之后又再看一看如何配置struts.xml:

<?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="hello" extends="struts-default" namespace="/">
		<interceptors>
			<interceptor name="testInterceptor" class="org.interceptor.InterceptorTest"></interceptor>
			<!-- 一个拦截器栈中可以定义多个拦截器 -->
			<interceptor-stack name="testStack">
				<interceptor-ref name="testInterceptor" />
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>
		<!--全局结果处理  -->
		<global-results>
			<result name="error">/Error.jsp</result>
		</global-results>
		<action name="login" class="org.interceptor.LoginAction">
			<result>/WEB-INF/pages/index.jsp</result>
		</action>
		<action name="admin" class="org.interceptor.LoginAction" method="AdminExecute">
			<interceptor-ref name="testStack"></interceptor-ref>
			<result>/WEB-INF/pages/admin.jsp</result>
		</action>
		<action name="vip" class="org.interceptor.LoginAction" method="vipExecute">
			<interceptor-ref name="testStack"></interceptor-ref>
			<result>/WEB-INF/pages/vipUser.jsp</result>
		</action>
		<action name="commen" class="org.interceptor.LoginAction" method="commenExecute"> 
			<interceptor-ref name="testStack"></interceptor-ref>
			<result>/WEB-INF/pages/commen.jsp</result>
		</action>
	</package>
</struts>

其中,<global-results></global-results>是全局的result,有很多时候一个<result>可供很多<action>使用,这时可以使用<global-results>标签来定义全局的<result>。执行顺序:当一个Action返回的String没有相应的<result>与之对应,Struts2就会查找全局的<result>,所以本次模拟测试中不符合条件被拦截的请求都会转到error.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(拦截器类):

package org.interceptor;

import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class InterceptorTest extends AbstractInterceptor{
	private static final long serialVersionUID = 2422100326160658352L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
		//获取了用户所要访问的路径,即在struts.xml中设置的action的name
		String url = invocation.getProxy().getActionName();
		HttpSession session = ServletActionContext.getRequest().getSession();
		//获取用户输入的用户名
		String username = (String) session.getAttribute("username");
		System.out.println(username);
		if(username.startsWith(url)){
			return invocation.invoke();
		}else{
			return "error";
		}
		
	}

}

只是 模拟拦截器的实现思路,没有持久层的数据,这里的方法是使用invocation.getProxy().getActionName()方法来获取struts.xml中配置的action名称,和用户表单提交的名称做对比,如果输入的用户名是以action名开头的,就放行,否则拦截。

登录jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">   
    <title>login</title>
  </head>
  
  <body>
    <form action="login.action">
    	<input type="text" name="username"/>
    	<input type="password" name="password"/>
    	<input type="submit" value="login">
    </form>
  </body>
</html>

拦截后跳转页:

<body>
   <h4>你的权限不足,请先升级权限...</h4>
 </body>

访问资源代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>index</title>
  </head>
  
  <body>
    <a href="admin.action">admin</a><br/>
    <a href="vip.action">vip</a><br/>
    <a href="commen.action">commen</a>
  </body>
</html>

其余admin.jsp等界面没有内容,只是为了区分实现跳转页面不同。

运行结果:

使用commen角色登录:

struts2如何使用拦截器进行用户权限控制

点击VIP以及admin跳转链接时:

struts2如何使用拦截器进行用户权限控制

当点击commen链接时成功跳转,这样就实现了用户权限的控制。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Speed Up Your Site

Speed Up Your Site

Andrew B. King / New Riders Press / 2003-01-14 / USD 39.99

There's a time bomb on the web: user patience. It starts ticking each time someone opens one of your pages. You only have a few seconds to get compelling content onto the screen. Fail, and you can kis......一起来看看 《Speed Up Your Site》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具