struts2如何使用拦截器进行用户权限控制
来源:互联网 发布:采购软件 编辑:程序博客网 时间:2024/05/17 01:11
大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对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 stubthis.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;@Overridepublic String intercept(ActionInvocation invocation) throws Exception {// TODO Auto-generated method stub//获取了用户所要访问的路径,即在struts.xml中设置的action的nameString 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链接时成功跳转,这样就实现了用户权限的控制。
1 0
- struts2如何使用拦截器进行用户权限控制
- Struts2中使用拦截器进行权限控制
- struts2 使用拦截器 实现用户权限的验证
- 如何使用struts2拦截器
- 如何使用struts2拦截器
- Struts2+ajax如何进行拦截器认证
- 使用拦截器进行权限的控制
- 使用springmvc拦截器进行登录控制
- 使用拦截器进行权限控制
- struts2中定义拦截器对访问权限进行控制
- 使用Spring Security进行用户权限控制
- 如何使用struts2拦截器 详解
- Struts2权限控制拦截器
- Struts2权限控制拦截器
- Struts2-拦截器-权限控制
- 使用Struts2的拦截器实现权限控制
- 使用Struts2的拦截器实现权限控制
- struts2中使用session和拦截器控制权限
- Java 内存模型
- 事务 索引 视图
- JavaScript笔记
- 关于硬链接和软连接(符号链接)的区别
- JBDC——Class.forName的作用?为什么要用?
- struts2如何使用拦截器进行用户权限控制
- MySQl——表的操作
- http://www.360doc.com/content/14/0415/09/15165033_369094772.shtml
- 数据库访问层
- switch case语句
- Access-Control-Allow-Origin跨域问题
- makefile 系列知识
- 驱动程序的模块化编程
- 若允许Tomcat所有域访问,将clientaccesspolicy.xml和crossdomain.xml加入%TOMCAT_HOME%\webapps\ROOT 目录下即可