- 浏览: 210034 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (267)
- java.lang (8)
- 问题汇总 (21)
- 异常记录 (20)
- 功能实现 (19)
- 面试总结 (25)
- 技巧总结 (8)
- 常用代码 (4)
- 编程习惯 (3)
- 编码规则 (3)
- java.util (10)
- java.io (1)
- JavaWeb (9)
- MySQL (16)
- SVN (3)
- MyBatis (11)
- Velocity (7)
- 其他知识 (10)
- 人生哲理 (1)
- 人生故事 (1)
- 自我感悟 (1)
- shiro (3)
- 基础知识 (0)
- 问题总结 (1)
- Spring 标签 (1)
- Spring (3)
- 点滴生活 (1)
- DOS (1)
- CAS (4)
- Linux (9)
- Storm (6)
- Shell (1)
- regex (1)
- Collection (4)
- poi (1)
- 经典语句 (1)
- NIO (5)
- concurrent (14)
- RPC (1)
- zookeeper (3)
- 待整理 (2)
- Hadoop (9)
- RabbitMq (2)
- flume (1)
- hive (7)
- hbase (4)
- kafka (1)
- scala (1)
- GC (0)
- java.util.concurrent.atomic (1)
- java.lang.ref (6)
- JVM (2)
- algorithm (1)
- conception (1)
- java key word (1)
- sun.misc (1)
最新评论
需求描述:
具体实现:
1.拦截器 配置文件shiro.ini
解释:
(1)filters指代自定义拦截器
authc2=com.fiter.FormAuthenticationFilter2,其中等号右侧为自定义拦截器代码,左侧为
指代
(2)urls指代需要进行拦截的URI
若该访问路径的URI需要有某种限制即需要被拦截器过滤下,即配制该拦截器
2.自定义拦截器
解释:
(1)request.getHeader("Referer"))获取上次访问的URL链接
a.原理:referer是浏览器在用户提交请求当前页面中的一个链接时,将当前页面的URL放在头
域中提交给服务端的,如当前页面为a.html,它里面有一个b.html的链接,当用户要访问b.html
时浏览器就会把a.html作为referer发给服务端.
b.限制:request.getHeader("Referer")要走HTTP协议才有值,也就是说要通过<a
href="url" />标记,才能获取到值。当然通过表单提交的也可以。而通过location或是<a
href="javascript:window.location=''" />是得不到值的
c.由于此处访问时未通过HTTP协议,故通过该方式获取的结果为空
(2)拦截器组装拦截后跳转的URL
3.实现效果
匿名访问:http://localhost:8080/m2b/usr/info/getuserinfo.do
拦截跳转:http://localhost:8080/m2b/login/loginpage.do?returnUrls=http%3A%2F%2Ft.com%2Fm2b%2Fusr%2Finfo%2Fgetuserinfo.do
该跳转URL为拦截器指定
4.跳转登陆
解释:
(1)request.getParameter("returnUrl");获取拦截器组装的指定的URL中的参数,即http://t.com?returnUrl=http%3A%2F%2F%2Fm2b%2Fusr%2Finfo%2Fgetuserinfo.do
(2)request.getParameter("");的使用
a.获取URL中的参数
b.获取页面通过submit方式的传值
- 用户在未登录时访问网站中某个需要登录后才能访问的URL
- 请求被拦截跳转登陆页面
- 登陆后跳转未登录时访问的路径
具体实现:
1.拦截器 配置文件shiro.ini
[urls] /usr/info/** = authc2 [filters] authc2=com.fiter.FormAuthenticationFilter2
解释:
(1)filters指代自定义拦截器
authc2=com.fiter.FormAuthenticationFilter2,其中等号右侧为自定义拦截器代码,左侧为
指代
(2)urls指代需要进行拦截的URI
若该访问路径的URI需要有某种限制即需要被拦截器过滤下,即配制该拦截器
2.自定义拦截器
public class FormAuthenticationFilter2 extends FormAuthenticationFilter { private static final Logger log = LoggerFactory.getLogger(FormAuthenticationFilter2.class);//定义日志输出 @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { if (isLoginRequest(request, response)) { if (isLoginSubmission(request, response)) { } return executeLogin(request, response); } else { if (log.isTraceEnabled()) { log.trace("Login page view."); } //allow them to see the login page ;) return true; } } else { if (log.isTraceEnabled()) { log.trace("Attempting to access a path which requires authentication. Forwarding to the " + "Authentication url [" + getLoginUrl() + "]"); } HttpServletRequest httpRequest = WebUtils.toHttp(request); // 组装URL StringBuilder returnUrl = new StringBuilder("http://t.com"); returnUrl.append(httpRequest.getRequestURI()); Enumeration enumeration = httpRequest.getParameterNames(); if(enumeration != null) { boolean first = true; while(enumeration.hasMoreElements()) { Object param = enumeration.nextElement(); if(param != null && httpRequest.getParameter(param.toString()) != null) { if(first) { returnUrl.append("?"); } returnUrl.append(param).append("=").append(httpRequest.getParameter(param.toString())).append("&"); first = false; } } } String encodedReturnUrl = returnUrl.toString(); if(encodedReturnUrl.endsWith("&")) { encodedReturnUrl = encodedReturnUrl.substring(0, encodedReturnUrl.length() - 1); } encodedReturnUrl = URLEncoder.encode(encodedReturnUrl, "UTF-8"); StringBuilder builder = new StringBuilder("/login/loginpage.do?returnUrl="); builder.append(encodedReturnUrl); setLoginUrl(builder.toString()); redirectToLogin(request, response); return false; } } }
解释:
(1)request.getHeader("Referer"))获取上次访问的URL链接
a.原理:referer是浏览器在用户提交请求当前页面中的一个链接时,将当前页面的URL放在头
域中提交给服务端的,如当前页面为a.html,它里面有一个b.html的链接,当用户要访问b.html
时浏览器就会把a.html作为referer发给服务端.
b.限制:request.getHeader("Referer")要走HTTP协议才有值,也就是说要通过<a
href="url" />标记,才能获取到值。当然通过表单提交的也可以。而通过location或是<a
href="javascript:window.location=''" />是得不到值的
c.由于此处访问时未通过HTTP协议,故通过该方式获取的结果为空
(2)拦截器组装拦截后跳转的URL
3.实现效果
匿名访问:http://localhost:8080/m2b/usr/info/getuserinfo.do
拦截跳转:http://localhost:8080/m2b/login/loginpage.do?returnUrls=http%3A%2F%2Ft.com%2Fm2b%2Fusr%2Finfo%2Fgetuserinfo.do
该跳转URL为拦截器指定
4.跳转登陆
@Action(value = "loginpage", results = { @Result(name = ResultTypeConstants.REDIRECT, type = ResultTypeConstants.REDIRECT, location = "/login/index.do"), @Result(name = ResultTypeConstants.ISSUE_REDIRECT, type = ResultTypeConstants.REDIRECT, location = "/login/issueredirect.do"), @Result(name = SUCCESS, type = ResultTypeConstants.VELOCITY, location = "/login.vm") }) @SkipValidation public String loginpage() { returnurl = request.getParameter("returnUrl"); if(returnurl == null) { returnurl = request.getHeader("Referer"); } logger.info("returnUrl:" + returnurl); request.getSession().setAttribute("returnUrl", returnurl); // 用户已登录 Subject currentUser = SecurityUtils.getSubject(); if (currentUser != null && currentUser.isAuthenticated()) { return ResultTypeConstants.REDIRECT; } if (currentUser != null && currentUser.isRemembered()) { user = (User) currentUser.getPrincipal(); rememberme = "1"; } return SUCCESS; }
解释:
(1)request.getParameter("returnUrl");获取拦截器组装的指定的URL中的参数,即http://t.com?returnUrl=http%3A%2F%2F%2Fm2b%2Fusr%2Finfo%2Fgetuserinfo.do
(2)request.getParameter("");的使用
a.获取URL中的参数
b.获取页面通过submit方式的传值
<form. name="form1" method="post" action="authenticate.jsp"> 请输入用户姓名:<input type="text" name="username"> <input type="submit" name="Submit" value="提交"> </form>
发表评论
-
使用软引用构建敏感数据的缓存
2017-11-16 22:19 843使用软引用构建敏感数 ... -
JSP自定义标签
2017-11-14 20:35 343JSP页面中分页功能实现使用了 <urlChange ... -
手机号码替换中间四位
2017-10-24 21:41 922需求描述: 为用户隐私考虑,展示用户信息时需要将中间用*代替 ... -
遍历集合删除元素
2017-10-24 18:44 658一、根据下标删除元素 1.测试代码 ArrayLis ... -
统计每天的数据
2017-10-10 21:23 543需求:按天统计数据 分析:create_time 为 dat ... -
基于AbstractDataSource实现主从数据库切换
2017-10-07 18:03 1044基于AbstractDataSource实现主从数据库切换 ... -
服务器文件下载
2016-03-27 09:53 378项目需求:在列表页面上提供文件下载链接 项目实现: 1.准 ... -
扫码登录功能实现
2015-08-21 08:19 518需求:PC端(电脑端) ... -
基于SHIRO的管理后台权限认证系统实现(一)
2015-07-09 10:05 7007基于SHIRO的管理后台权限认证系统实现(一) 一、项目需求 ... -
基于SHIRO的管理后台权限认证系统实现(二)
2015-06-28 10:14 820用户登陆系统后左侧菜单加载 项目:管理员系统 功能:用户登 ... -
Velocity中set的使用
2015-05-26 10:46 531问题:从页面接收某字段的提交数据,数据要求是组合后的编号 ... -
Velocity页面中输出时间年月
2015-05-19 20:52 998问题:注册页面要求有创建时间的选项添加,年为至今为止 实现: ... -
Set判重操作实现
2015-05-15 15:28 801需求:Set<Po>判重操作实现 问题:Set& ... -
如何去除List集合中的重复数据
2015-05-15 13:12 913需求:用户权限查看, ... -
Date相关功能实现
2015-05-12 19:47 628一、同一天 需求:用户记录跟踪列表展示,要求用户数据同一天内 ... -
velocity截取过长的字段值
2015-05-11 20:06 378问题:页面列表展示时,某个字段的值超长,影响页面的整体样式 ... -
将list中某个元素放在首位
2015-05-10 17:25 4578需求:程序开发过程中,业务方要求在展示国家列表时要将US放在首 ... -
Velocity遍历map与遍历list
2015-04-22 20:16 6947问题: 向页面传递key与value的组合 1. 1.1 ...
相关推荐
这些拦截器可以基于URL路径或特定的HTTP方法(如GET、POST等)来决定是否允许用户访问。Shiro的Web模块提供了一个名为`FilterChainResolver`的接口,它负责构建和解析过滤链,将URL映射到对应的过滤器。 以下是使用...
基于shiro实现的用户登录系统,运行sql文件更改数据库连接可直接运行,项目集成了mybatis-plus,shiro,springmvc,角色管理和组管理,非常简单实用,非常适合学习,不用输入验证码可以登录,admin密码123456
在IT行业中,单点登录(Single Sign-On,简称SSO)是一种身份验证机制,它允许用户在一个应用系统中登录后,无需再次认证即可访问其他相互信任的应用系统。Apache Shiro是一个强大且易用的Java安全框架,提供了认证...
本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能
SpringBoot集成Shiro实现动态URI权限是一个常见的权限管理实践,主要目的是为了实现更灵活、更安全的用户访问控制。在Web应用中,权限控制通常包括角色管理、菜单管理、操作权限(URI)管理等,而动态URI权限则允许...
SpringBoot整合Shiro后实现免密登录 1,说明一下步骤,需要在原来基础新增三个文件 2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增...
正确配置 Shiro 的过滤器链定义,确保只有需要认证的URL会被保存,这样才能在用户登录后跳转到他们最初尝试访问的页面。在实际应用中,根据项目的具体需求,可以结合这两种方法,以提供更优质的用户体验。
3. **编写Service**:在业务逻辑层,实现用户登录、获取用户角色及权限、动态加载菜单等功能。登录时,通过Shiro进行认证,成功后获取用户的角色和对应的权限。 4. **创建Controller**:在控制器层,处理前端的登录...
在本文中,我们将讨论如何利用 Shiro 实现用户退出登录时清空缓存。 首先,Shiro 提供了一个 `LogoutFilter` 过滤器,用于处理用户的登出请求。默认情况下,`LogoutFilter` 在用户登出时会清除会话中的所有信息,...
总之,这个基于Shiro的分布式权限管理系统结合了现代Web开发的最佳实践,利用Shiro的强大功能和Redis集群的高效缓存,实现了安全、高效的用户权限管理。在实际开发中,这样的架构可以为大型互联网应用提供稳定、可...
通过以上步骤,我们可以构建一个基础的Shiro安全框架,实现用户登录验证和基于角色/权限的访问控制。随着项目复杂性的增加,可以进一步探索Shiro的其他特性,如缓存管理、Web集成、API安全等,以满足更高级的安全...
Shiro 提供了丰富的API和组件,使得开发者能够快速集成到自己的应用中,实现用户的身份验证和授权。 1. **Shiro基础概念** - **认证**:也称为身份验证,是确认用户身份的过程。在Shiro中,可以通过...
在这个例子中,`/login`路径被配置为匿名访问,允许任何用户访问登录页面,而其他所有路径(`/**`)都需要经过身份验证(`authc`)。如果用户试图访问受保护的资源且未登录,Shiro会将请求重定向到登录页面。 此外,...
Shiro支持基于URL的权限拦截,这意味着可以为每个URL分配特定的访问权限,只有拥有相应权限的用户才能访问。这种方式提高了权限控制的粒度,使权限管理更为精细化。 JWT(JSON Web Token)是一种轻量级的身份验证...
SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 ...
在基于URL的权限管理中,Shiro会检查用户的权限与他们尝试访问的URL是否匹配。 3. **会话管理(Session Management)**:Shiro可以协助管理用户会话,包括创建、更新、删除会话以及会话超时等。 **基于URL的权限...
Shiro的动态URL权限控制主要是通过`AuthorizationFilter`实现的,这个过滤器会检查当前用户是否有访问特定URL的权限。Shiro提供了`@RequiresPermissions`和`@RequiresRoles`等注解,可以用于控制器方法上,以声明...
### Shiro 获取登录状态与用户信息 在Java Web开发领域,Apache Shiro 是一个非常流行的权限管理框架。它提供了一套完整的认证、授权、加密和会话管理功能。本篇文章将详细介绍如何通过Shiro框架来获取用户的登录...
在这个"shirodemo实现web登陆"的项目中,我们将探讨如何利用 Shiro 框架在 Web 应用中实现用户登录功能,以及相关的 JSP 和 HTML 集成。 1. **Shiro 的核心概念**: - **Authentication(认证)**:验证用户身份,...
1. **配置Shiro**:在SpringBoot应用中引入Shiro依赖,然后配置Shiro Realm,实现用户认证和授权逻辑。Realm是Shiro与应用中的用户数据源交互的接口,你可以自定义 Realm 类以连接数据库或其他用户存储。 2. **编写...