Struts2拦截器实例-权限拦截器
来源:互联网 发布:剑灵门派时装数据 编辑:程序博客网 时间:2024/05/18 21:38
查看本例之前首先要大概了解struts2的理论知识(点击查看)
本例实现了一个权限拦截器!
需求:要求用户登录,且必须为指定用户名才可以查看系统中的某个视图资源,如果不满足这两个条件,系统直接转入登录页面!
问题:怎样检查用户登录?
答:跟踪用户的HTTP Session
实现方式有两种:
1.在每个action执行处理逻辑之前,先执行权限检查!但是多了很多重复代码,这是我们不愿意看到的!
2.将权限检查逻辑放在拦截器中,解决了方法一种重复代码的问题!
下面以第二种实现方式实现这个实例:
步骤:
1.搭建struts2环境(点击查看详细搭建过程)
2.实现拦截器类(继承AbstractInterceptor)
import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class AuthorityInterceptor extends AbstractInterceptor{ //拦截action处理的拦截方法 @Override public String intercept(ActionInvocation invocation) throws Exception { //取得请求相关的ActionContext实例 ActionContext act=invocation.getInvocationContext(); //取出名为user的session属性 String user = (String)act.getSession().get("user"); //如果user不为空且用户名是test if(user!=null&&"test".equals(user)){ //放行到下一个拦截器或者action中的方法 return invocation.invoke(); } ((ActionSupport)invocation.getAction()).addActionError("sorry,还没有登录"); //直接返回login逻辑视图 return Action.LOGIN; }}
3.实现Action
package action;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.util.ValueStack;/** * * @author User * */public class LoginAction extends ActionSupport{ private String userName; private String pwd; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String execute() throws Exception {//用户名是lee密码是123或者用户名是test密码是123都是正确的用户名和密码 if("lee".equals(getUserName())||"test".equals(getUserName())&&"123".equals(getPwd())){ //获取session Map<String, Object> session = ActionContext.getContext().getSession(); session.put("user", getUserName()); return SUCCESS; }else{ ValueStack valueStack = ActionContext.getContext().getValueStack(); valueStack.set("error", "请输入正确的用户名和密码"); return INPUT; } } //查看图书列表 public String view() throws Exception { return SUCCESS; }}
4.编写jsp页面
4.1loginForm.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!--引入struts2标签 --><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'traditional.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> ${error} <s:form action="test/loginPro" method="post"> <s:textfield name="userName" label="用户名"/> <s:textfield name="pwd" label="密码"/> <s:submit value="提交"/> </s:form> </body></html>
4.2viewBook.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!--引入struts2标签 --><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'traditional.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 图书展示 </body></html>
4.3viewRequest.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!--引入struts2标签 --><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'traditional.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <a href="test/viewBook">点击查看图书</a> </body></html>
5.配置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> <!-- 包为lee --> <package name="lee" extends="struts-default" namespace="/test" > <!-- 配置拦截器 --> <interceptors> <interceptor name="authority" class="interceptor.AuthorityInterceptor"></interceptor> </interceptors> <!-- 定义全局result (因为大部分action都要跳到loginForm.jsp页面,避免写重复代码,所以定义全局result)--> <global-results> <result name="login">/WEB-INF/content/loginForm.jsp</result> </global-results> <!-- 配置action --> <!-- 若没有指定class属性 默认使用ActionSupport --> <action name="viewBook" class="action.LoginAction" method="view"> <!-- 通过拦截器的检查会调到viewBook.jsp页面 --> <result name="success">/WEB-INF/content/viewBook.jsp</result> <!-- 引用默认拦截器 因为action中显示应用了authority拦截器--> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 使用自定义的拦截器 --> <interceptor-ref name="authority"> </interceptor-ref> </action> <action name="loginPro" class="action.LoginAction"> <!-- 登录成功以后,转到下一个action --> <result name="success" type="chain">viewBook</result> <!-- 当输入的账号密码是错误的 跳到loginForm.jsp页面 --> <result name="input">/WEB-INF/content/loginForm.jsp</result> </action> <!--配置action 这个action可以处理各种请求 目的是为了保护jsp页面 将jsp页面放在WEB-INF下 这个action一般放在所有action之后 --> <action name="*"> <!--直接跳到*所代表的页面 --> <result>/WEB-INF/content/{1}.jsp</result> </action> </package></struts>
代码编写完毕,查看文件结构(使用myEclipse作为开发工具,tomcat作为服务器)
发布以后测试:
测试分为六种情况
情况一:用户没有登录直接访问viewBook.jsp页面
地址:http://127.0.0.1:8080/struts2Study37/test/viewBook
结果:跳转到loginForm.jsp页面
分析:当输入这个地址以后,发送test/viewBook请求,该请求被权限拦截器拦截(struts.xml中配置了),拦截器检测到用户没有登录,执行拦截器中的return Action.LOGIN;代码,于是跳转到loginForm.jsp页面!
情况二:用户访问loginForm.jsp页面,输入错误的账号和密码
地址:http://127.0.0.1:8080/struts2Study37/test/loginForm
结果:仍在loginForm.jsp页面,提示请输入正确的账号和密码
分析:点击登录之后,发送的是test/loginPro请求,该请求拦截器不拦截(struts.xml配置了),执行loginAction中的execute方法,用户名和密码不匹配,执行execute方法中的return INPUT;代码,于是跳转到loginForm.jsp页面
情况三:用户访问loginForm.jsp页面,输入正确的账号和密码(账号是lee密码是123)
地址:http://127.0.0.1:8080/struts2Study37/test/loginForm
结果:仍在loginForm.jsp页面
分析:点击登录以后,发送test/loginPro请求,执行loginAction中的execute方法,用户名和密码匹配,执行execute方法中的return SUCCESS;代码,于是跳转到viewBook这个action(struts.xml中配置了),这个请求拦截器会进行拦截,检测到用户虽然登录,但是用户名不匹配,执行拦截器中的return Action.LOGIN;代码,于是跳转到loginForm.jsp页面!
情况四:用户访问loginForm.jsp页面,输入正确的账号和密码(账号是test密码是123)
地址:http://127.0.0.1:8080/struts2Study37/test/loginForm
结果:出现“图书展示”四个大字
分析:点击登录以后,发送test/loginPro请求,执行loginAction中的execute方法,用户名和密码匹配,执行execute方法中的return SUCCESS;代码,于是跳转到viewBook这个action(struts.xml中配置了),这个请求拦截器会进行拦截,检测到用户登录,而且用户名匹配,执行拦截器放行,执行loginAction中的view()方法,于是跳转到viewBook.jsp页面!
情况五:用户直接在地址栏中输入http://127.0.0.1:8080/struts2Study37/test/viewBook
结果:出现“图书展示”四个大字
分析:当输入这个地址以后,发送test/viewBook请求,该请求被权限拦截器拦截(struts.xml中配置了),拦截器检测到用户已经登录且用户名匹配,执行拦截器放行,执行loginAction中的view()方法,于是跳转到viewBook.jsp页面!
情况六:超过一定时间、服务器重启、浏览器关闭后,再输入http://127.0.0.1:8080/struts2Study37/test/viewBook
结果:跳转到loginForm.jsp页面
分析:session已经失效,若要出现情况五的结果,需要再次执行情况四的步骤!
- Struts2拦截器实例-权限拦截器
- Struts2权限控制拦截器
- Struts2权限控制拦截器
- Struts2-拦截器-权限控制
- Struts2拦截器权限学习心得
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证 .
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2自定义拦截器实例—登陆权限验证
- Struts2 自定义拦截器实例—登陆权限验证
- FL Studio中循环与消噪栏该怎么进行设置
- SVG路径描边动画效果
- C++三大特性之多态
- makefile文件备份
- C#中事件的继承
- Struts2拦截器实例-权限拦截器
- 数据结构实验之图论七:驴友计划
- Android 转场动画 windowAnimation和ActivityAnimation的区别
- 欢迎使用CSDN-markdown编辑器
- 欢迎大家关注我的微信公众号 一大一卜天下;
- VC2015编译旧工程找不到头文件stdio.h
- ImageView的基本参数和Bitmap的基本用法
- PHP中的Traits详解
- 微信小程序全方位深度解析【免费学习】