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

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

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

先看一下Demo的整体结构:


首先搭建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角色登录:

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


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





目录
相关文章
|
5月前
|
数据安全/隐私保护
Shiro权限管理的过滤器解释
Shiro权限管理的过滤器解释
|
8月前
|
安全
springsecurity配置类以及授权逻辑的编写
springsecurity配置类以及授权逻辑的编写
61 0
|
9月前
|
前端开发 JavaScript Java
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回
本篇将要学习 Spring Boot 统一功能处理模块,这也是 AOP 的实战环节 用户登录权限的校验实现接口 HandlerInterceptor + WebMvcConfigurer 异常处理使用注解 @RestControllerAdvice + @ExceptionHandler 数据格式返回使用注解 @ControllerAdvice 并且实现接口 @ResponseBodyAdvice
327 0
|
11月前
|
消息中间件 JavaScript 小程序
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
|
11月前
|
JavaScript 前端开发 小程序
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 上
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 上
|
缓存 安全 网络安全
配置Shiro核心过滤器与相关配置
<!--anon 表示匿名访问,不需要认证以及授权--> <!--authc表示需要认证 没有进行身份认证是不能进行访问的--> <!--roles[admin]表示角色认证,必须是拥有admin角色的用户才行--> <!--user表示用户不一定已通过认证,只要曾被Shiro记住过登录状态的用户就可以正常发起请求,比如rememberMe--> <!--perms表示指定过滤规则,这个一般是扩展使用,不会使用原生的--> <!--port表示请求的URL端口验证--> <!--ssl表示安全的URL请求,协议为https--> <!--rest表示根据请求的方法,
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)上
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)
132 0
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)上
|
Java 数据安全/隐私保护 容器
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)下
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)
145 0
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)下
|
前端开发
MVC 自定义过滤器/特性来实现登录授权及验证
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。    十年河东十年河西,莫欺少年穷    学无止境,精益求精    最近在做自学MVC,遇到的问题很多,索性一点点总结下。
1861 0
|
前端开发 Java Spring
springMVC使用拦截器检查用户登录
参考文章 编写拦截器类 package cultivate_web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.
1229 0