Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】
应用情形:在web项目中,经常会遇到用户未登录或SESSION失效时用户发出非法的权限操作,如新闻的评论、文件的下载等等,在此我们可以使用struts拦截器对该用户发出的请求进行拦截,拦截后判断用户是否登录或SESSION是否有效,然后进行其正常操作。具体实例如下:
新建一个拦截器类UserInterceptor ,UserInterceptor.java代码如下
- package com.hsinghsu.test.interceptor;
- import com.opensymphony.xwork2.*;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- import java.util.*;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts2.ServletActionContext;
- public class UserInterceptor extends AbstractInterceptor {
- private static final long serialVersionUID = 4956767125951165062L;
- // 拦截Action处理的拦截方法
- public String intercept(ActionInvocation invocation) throws Exception {
- // 取得请求相关的ActionContext实例
- ActionContext ctx = invocation.getInvocationContext();
- Map<String, Object> session = ctx.getSession();
- // 取出名为user的Session属性
- String user = (String) session.get("user");
- // 如果已经登录,放行
- if (user != null && user.equals("hsing")) {
- return invocation.invoke();
- }
- // 获取HttpServletRequest对象
- HttpServletRequest req = ServletActionContext.getRequest();
- // 获取此请求的地址
- String path = req.getRequestURI();
- System.out.println("path:" + path);
- // 存入session,方便调用
- session.put("prePage", path);
- // 没有登录,将服务器提示设置成一个HttpServletRequest属性
- ctx.put("tip", "您还没有登录,请输入hsing,hsu登录系统");
- // 直接返回login的逻辑视图
- return "login";
- }
- }
package com.hsinghsu.test.interceptor;import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;public class UserInterceptor extends AbstractInterceptor {private static final long serialVersionUID = 4956767125951165062L;// 拦截Action处理的拦截方法public String intercept(ActionInvocation invocation) throws Exception {// 取得请求相关的ActionContext实例ActionContext ctx = invocation.getInvocationContext();Map<String, Object> session = ctx.getSession();// 取出名为user的Session属性String user = (String) session.get("user");// 如果已经登录,放行if (user != null && user.equals("hsing")) {return invocation.invoke();}// 获取HttpServletRequest对象HttpServletRequest req = ServletActionContext.getRequest();// 获取此请求的地址String path = req.getRequestURI();System.out.println("path:" + path);// 存入session,方便调用session.put("prePage", path);// 没有登录,将服务器提示设置成一个HttpServletRequest属性ctx.put("tip", "您还没有登录,请输入hsing,hsu登录系统");// 直接返回login的逻辑视图return "login";}
}
新建登录action,LoginAction.java代码如下:
- package com.hsinghsu.test.action;
- import com.opensymphony.xwork2.ActionSupport;
- import com.opensymphony.xwork2.ActionContext;
- import java.util.*;
- public class LoginAction extends ActionSupport {
- private static final long serialVersionUID = 8013816027944871760L;
- private String username;// 登录用户名
- private String password;// 登录密码
- private String prePage;// 登录前页面
- public String execute() throws Exception {
- if (null != username && null != password && username.equals("hsing") && password.equals("hsu")) {
- ActionContext ctx = ActionContext.getContext();
- Map<String, Object> session = ctx.getSession();
- //保存用户信息session
- session.put("user", getUsername());
- // 获取跳转到登陆界面之前的页面地址,由拦截器提供
- prePage = (String) session.get("prePage");
- // 清除session中的数据
- session.remove("prePage");
- if (null == prePage) {
- return "usercenter";// 不是拦截器跳转到登陆页面的,直接访问的登陆页面
- } else {
- return SUCCESS;// 是拦截器跳转到登陆登录前页面
- }
- } else {
- return INPUT;
- }
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getUsername() {
- return this.username;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getPassword() {
- return this.password;
- }
- public String getPrePage() {
- return prePage;
- }
- public void setPrePage(String prePage) {
- this.prePage = prePage;
- }
- }
package com.hsinghsu.test.action;import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;import java.util.*;public class LoginAction extends ActionSupport {private static final long serialVersionUID = 8013816027944871760L;private String username;// 登录用户名private String password;// 登录密码private String prePage;// 登录前页面public String execute() throws Exception {if (null != username && null != password && username.equals("hsing") && password.equals("hsu")) {ActionContext ctx = ActionContext.getContext();Map<String, Object> session = ctx.getSession();//保存用户信息sessionsession.put("user", getUsername());// 获取跳转到登陆界面之前的页面地址,由拦截器提供prePage = (String) session.get("prePage");// 清除session中的数据session.remove("prePage");if (null == prePage) {return "usercenter";// 不是拦截器跳转到登陆页面的,直接访问的登陆页面} else {return SUCCESS;// 是拦截器跳转到登陆登录前页面}} else {return INPUT;}}public void setUsername(String username) {this.username = username;}public String getUsername() {return this.username;}public void setPassword(String password) {this.password = password;}public String getPassword() {return this.password;}public String getPrePage() {return prePage;}public void setPrePage(String prePage) {this.prePage = prePage;}
}
配置拦截器与action映射关系,struts.xml代码如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <constant name="struts.custom.i18n.resources" value="globalMessages" />
- <constant name="struts.i18n.encoding" value="UTF-8" />
- <package name="hsinghsu" extends="struts-default">
- <!-- 用户拦截器定义 -->
- <interceptors>
- <interceptor name="userInterceptor" class="com.hsinghsu.test.interceptor.UserInterceptor" />
- </interceptors>
- <!-- 定义全局result -->
- <global-results>
- <result name="login">/jsp/login.jsp</result>
- </global-results>
- <action name="loginPro" class="com.hsinghsu.test.action.LoginAction">
- <result name="success" type="redirectAction">${prePage}</result>
- <result name="input">/jsp/login.jsp</result>
- <result name="usercenter">/jsp/userCenter.jsp</result>
- </action>
- <action name="productList">
- <result name="success">/jsp/productList.jsp</result>
- <interceptor-ref name="defaultStack" /> <!-- 默认拦截器 -->
- <interceptor-ref name="userInterceptor" /> <!-- 应用自定义拦截器 -->
- </action>
- </package>
- </struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN""http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts><constant name="struts.custom.i18n.resources" value="globalMessages" /><constant name="struts.i18n.encoding" value="UTF-8" /><package name="hsinghsu" extends="struts-default"><!-- 用户拦截器定义 --><interceptors><interceptor name="userInterceptor" class="com.hsinghsu.test.interceptor.UserInterceptor" /></interceptors><!-- 定义全局result --><global-results><result name="login">/jsp/login.jsp</result></global-results><action name="loginPro" class="com.hsinghsu.test.action.LoginAction"><result name="success" type="redirectAction">${prePage}</result><result name="input">/jsp/login.jsp</result><result name="usercenter">/jsp/userCenter.jsp</result></action><action name="productList"><result name="success">/jsp/productList.jsp</result><interceptor-ref name="defaultStack" /> <!-- 默认拦截器 --><interceptor-ref name="userInterceptor" /> <!-- 应用自定义拦截器 --></action></package>
</struts>
登录页面login.jsp代码如下:
- <%@ page contentType="text/html; charset=utf-8" language="java"
- errorPage=""%>
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>登录页面</title>
- </head>
- <body>
- <h3>用户登录</h3>
- ${tip}
- <s:form action="loginPro">
- <s:textfield name="username" label="用户名" />
- <s:password name="password" label="密码" />
- <s:submit value="登录" />
- </s:form>
- </body>
- </html>
<%@ page contentType="text/html; charset=utf-8" language="java"errorPage=""%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>登录页面</title>
</head>
<body><h3>用户登录</h3>${tip}<s:form action="loginPro"><s:textfield name="username" label="用户名" /><s:password name="password" label="密码" /><s:submit value="登录" /></s:form>
</body>
</html>
产品列表页面productList.jsp代码如下:
- <%@ page contentType="text/html; charset=utf-8" language="java"
- errorPage=""%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>产品列表</title>
- </head>
- <body>
- <h2>水果:</h2>
- 苹果<br/> 橘子<br/> 香蕉<br/>
- </body>
- </html>
<%@ page contentType="text/html; charset=utf-8" language="java"errorPage=""%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>产品列表</title>
</head>
<body><h2>水果:</h2>苹果<br/> 橘子<br/> 香蕉<br/>
</body>
</html>
用户中心userCenter.jsp代码如下:
- <%@ page contentType="text/html; charset=utf-8" language="java"
- errorPage=""%>
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>成功页面</title>
- </head>
- <body>个人用户中心,您已经登录!
- </body>
- </html>
<%@ page contentType="text/html; charset=utf-8" language="java"errorPage=""%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>成功页面</title>
</head>
<body>个人用户中心,您已经登录!
</body>
</html>
验证:
情形一:若用户未登录,输入http://localhost:8686/testInterceptor/productList.action
则系统会自动跳转到login.jsp页面,进行用户登录,登录后系统会自动跳到productList.jsp前台展现页面。
情形二:若用户已登录,输入http://localhost:8686/testInterceptor/productList.action
则系统直接跳转到productList.jsp前台展现页面。
情形三:若用户未登录,输入http://localhost:8686/testInterceptor/testInterceptor/loginPro.action
则系统会自动跳转到login.jsp页面,进行用户登录,登录后系统会自动跳到userCenter.jsp前台展现页面。
Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】相关推荐
- php拦截登录页面跳转页面,PHP未登录自动跳转到登录页面
PHP未登录自动跳转到登录页面 下面一段代码给大家分享php未登录自动跳转到登录页面,具体代码如下所示: namespace Home\Controller; use Think\Controller ...
- 案例分享:Qt西门子机床人机界面以及数据看板定制(西门子通讯,mysql数据库,生产信息,参数信息,信息化看板,权限控制,播放器,二维图表,参数调试界面)
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/118685521 长期持续带来更多项目与技术分 ...
- python描述器做权限控制_Python装饰器14-描述器
描述器 这是Python一个重要的概念,英文名:Descriptor descriptor是对象的一个属性,只不过它存在于类的dict中并且有特殊方法get(可能还有set和__delete)而具有一 ...
- 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...
1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...
- 案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,期限控制,参数调试等)
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127669684 长期持续项目技术分享,有专业Qt需求请 ...
- 案例分享:Qt工程机械真空激光焊接系统软件产品定制(西门子PLC,mysql数据库,用户权限控制,界面配置,参数定制,播放器,二维图标,rgv小车,期限控制,参数调试等)
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127214512 长期持续项目技术分享,有需求请回博客首 ...
- vue---axios拦截器处理登录失效跳转登录页
axios拦截器(Interceptors)主要分为: (1)请求拦截器:在发送请求前进行拦截,可以根据发送的请求参数做一些发送参数的调整,例如设置headers (2)响应拦截器:在后台返回响应时进 ...
- axios拦截器 config_vue中axios拦截器的使用
1.拦截器分为request请求拦截器和response响应拦截器 PS:request请求拦截器:发送请求前统一处理,如:设置请求头headers.应用的版本号.终端类型等. response响应拦 ...
- struts 权限控制
今天结合Java的Annotation和Struts2进行注解拦截器权限控制. 功能需求:添加.查找.删除三个功能,添加.查找功能需进行权限拦截判断,删除功能则不需进行权限拦截判断. 操作流程如下:客 ...
最新文章
- Linux下新增硬盘处理过程
- mysql error 10048_mysql 连接异常(10048)
- c#操作xml实例 2009-03-13 20:00
- swift中的@objc
- Linux内核源码行数,Linux源代码已超过1000万行 价值达5亿美金
- linux usb 升级脚本,linux – 使用bash脚本更新CRON
- key map 模糊查找_lua脚本语言批量删除模糊查询的key
- 可视化管理_RFID技术实施智能仓储管理可视化
- ChaiNext:比特币打穿4.2万美元,市场多空胶着
- Crackeme021
- HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站...
- 在线抖音去水印,下载抖音背景音乐
- 计算机c盘突然少了几个G,做系统时c盘显示0容量-关于Windows系统c盘突然没了十几个g...
- 啃书:《利用Python进行数据分析》第一章
- pytorch中dataloader的num_workers参数
- mac 终端查看端口命令
- list中移除元素:用remove(i)方法遇到的坑以及替代方法
- JavaScript (上篇)
- 《青山翠影》叁 爱情的模样 | 似懂非懂
- 如何解决Win11系统崩溃的问题?
热门文章
- python六角形的绘制
- Java8 EnumMap 源码分析
- VTK:BSP树时序用法实战
- wxWidgets:启动默认浏览器
- boost::ratio_greater_equal相关的测试程序
- boost::mp11::mp_iterate相关用法的测试程序
- 基于Boost::beast模块的异步HTTP客户端
- Boost:不受约束的集合bimap的测试程序
- Boost:与容器相关的BOOST_TEST_EQ测试
- DCMTK:OFStandard类的测试程序