Struts2实现登录权限访问控制
目录:
Ⅰ 条件
Ⅱ 目的
Ⅲ 分析
Ⅳ 实现
Ⅴ 具体代码实现
--------------------------------------------------------------------------------------
一、条件
1. 假设有个项目的目录如图一所示。(图一)
2. 其中login.jsp和index.jsp是放在/WebRoot目录下的。其余的放在相应的文件夹里。
3. 现在要求用户在未登录的情况下,只能进入login.jsp页面,如果登录了,就可以进入index.jsp和其它页面。
4. 如果用户直接在地址栏上输入URI进行非法请求,既绕过登录验证直接访问其它内容页的话,将重定向页面到login.jsp页面。
(图一)
二、目的
1. 防止用户直接输入URL绕过登录进行访问;
三、分析
1. URL的形式有两种,一种是通过Struts2的*.action,另一种是jsp的*.jsp,都要对其进行控制。
2. *.action形式的访问使用struts2的拦截器进行验证。
3. *.jsp形式的访问使用Filter过滤器进行验证。
四、实现
1. Filter的实现:
①. 获取请求的URI;并把该URI截取到访问的相对路径,可以通过这个来进行相应的权限控制。把最后的地址保存为uri;
如:/ElectiveSystem/login.jsp ---截取---> /login.jsp
②. 判断uri是否为"login.jsp",如果是,直接放行;如果不是,那么就通过request.getSession()获取session,在通过session
获取用户登录信息,如果登录信息为空,则重定向到login.jsp页面;如果不为空,那么就直接放行。
2. Interceptor的实现(Struts2 的拦截器):
①. 通过invocation获取ActionContext对象。 (ActionContext context = invocation.getInvocationContext())
②. 再通过ActionContext对象获取HttpServletRequest对象。
(HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST))
③. 获取请求的URI;并把该URI截取到访问的相对路径,可以通过这个来进行相应的权限控制。把最后的地址保存为uri;
如: /ElectiveSystem/admin/admin_login.action -->/admin/admin_login.action
④. 判断uri。
五、具体代码实现:
PowerFilter:
@Override
public
void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//取得根目录的绝对路径
String currentURL = request.getRequestURI();
// System.out.println("当前请求的路径: " + currentURL);
//截取到访问的相对路径,可以通过这个来进行相应的权限控制
currentURL =currentURL.substring(currentURL.indexOf("/", 1), currentURL.length());
// System.out.println("当前请求的路径: " + currentURL);
if("/login.jsp".equals(currentURL)||"/login.jsp"==currentURL) {
//所有人都能请求到的URI,放行
chain.doFilter(request, response);
} else { //下面是判断是否有session,也就是用户是否已登录状态;
HttpSession session = request.getSession();
Object obj = session.getAttribute("user");
if(obj == null) {
//System.out.println("URI:" + currentURL + ">>>>访问被拒绝!");
response.sendRedirect("/ElectiveSystem/login.jsp");
} else {
chain.doFilter(request, response);
}
}
}
PowerInterceptor:
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = invocation.getInvocationContext();
//通过ActionContext来获取httpRequest
HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST);
//也可以通过ServletActionContext来获取httpRequest
//HttpServletRequest request = ServletActionContext.getRequest();
//取得根目录的绝对路径
String currentURL = request.getRequestURI();
//截取到访问的相对路径,可以通过这个来进行相应的权限控制
// System.out.println("当前请求的路径: " + currentURL); // 如: /ElectiveSystem/admin/admin_login.action
String targetURL = currentURL.substring(currentURL.indexOf("/", 1), currentURL.length());
// System.out.println("当前请求的路径: " + currentURL); //如: /admin/admin_login.action
if("/admin/admin_login.action".equals(targetURL)||"/stu/stu_login.action".equals(targetURL)||"/th/th_login.action".equals(targetURL)){
//执行方法,获取返回值
String result = invocation.invoke();
//System.out.println(result);
return result;
}else{
//通过ActionContext获取session的信息。
Object obj = context.getSession().get("user");
//获取容器里面的user值,如果存在说明该用户已经登录,让他执行操作,如果未登录让他进行登录
if(obj!=null){
return invocation.invoke();
}
}
return "input";
}
Struts2实现登录权限访问控制的更多相关文章
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建
SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...
- JavaWeb -- Struts 自定义拦截器, 登录权限拦截
1. 自定义拦截器, 登录权限拦截 login.jsp 登录JSP <%@ page language="java" contentType="text/html; ...
- RBAC基于角色的权限访问控制
RBAC是什么,能解决什么难题?ThinkPHP中RBAC实现体系安全拦截器认证管理器访问决策管理运行身份管理器ThinkPHP中RBAC认证流程权限管理的具体实现过程RBAC相关的数据库介绍Th ...
- MySQL 用户登录密码和远程登录权限问题
1.mysql数据库,忘记root用户登录密码. 解决如下: a.重置密码 #/etc/init.d/mysqld stop #mysqld_safe --user=mysql --skip-gran ...
- MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库
Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ...
- [转]MYSQL远程登录权限设置
Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED B ...
- MYSQL远程登录权限设置(转)
Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ...
- MYSQL远程登录权限设置
Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ...
随机推荐
- WSingle主题 – 可能是最好的WordPress小说主题,美观大方,功能强大
今天,waitig给大家带来了一款强大WordPress小说主题 – WSingle主题. 一.概览 WSingle主题2.0版本已经发布,点击查看详情:[重磅]WSingle主题2.0版本发布,新增 ...
- 2-sat 学习笔记
一.问题描述 以你咕的模板题为例 题目描述 有\(n\)个布尔变量\(x_1\)~\(x_n\),另有\(m\)个需要满足的条件,每个条件的形式都是"\(x_i\)为true/false或\ ...
- php中json_encode和json_decode的用法
1.json_encode基本用法:数组转字符串 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); ...
- hihocoder 后缀自动机五·重复旋律8 求循环同构串出现的次数
描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi发现旋律可以循环,每次把一段旋律里面最前面一个音换到最后面就成为了原旋律的“循环相似旋律”,还可以 ...
- Android横竖屏切换解决方案
Android横竖屏切换解决方案 首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidde ...
- 51Nod 1561 另一种括号序列
题目链接 分析: 卡常数~~~好气啊~~~这是看脸的时代啊~~~ $A$代表$($的数量,$B$代表$)$的数量... 如果$($的数量多于$)$的数量,那么最有方案显然是添加$A-B$个$)$... ...
- 【CF1020E】Sergey's problem(构造)
题意: 思路:这是一道论文题 https://link.springer.com/content/pdf/10.1007/BFb0066192.pdf From http://www.cnblogs. ...
- 关于0x*** 十六进制的运算。为什么枚举多用十六进制的运算原因。。
1.看个人爱好 2.可以看出布尔运算的结果. 3.可以更快进行and和or 运算
- 使用srvany.exe把程序安装成windows服务
srvany.exe介绍 srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说srva ...
- error LNK2019: 无法解析的外部符号 _deflate
我的环境为: Win764 + VS2005 + zlib1.2.8 zlib1.2.8我使用VS2010来编译. ------------------------------------------ ...