出处: https://www.cnblogs.com/lyxy/p/6694387.html

项目中需要所有首次登录的用户必须修改密码才可使用系统,项目采用的是Shiro框架。

突然想到了配置文件org.apache.shiro.spring.web.ShiroFilterFactoryBean中的loginUrl,校验未登录则跳转到登录地址。索性研究了它的源码后可以继承AccessControlFilter自定义自己的过滤器。

自定义Shiro过滤器:

package com.lwj.modules.filter;import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.StringUtils; import org.apache.shiro.web.filter.AccessControlFilter; import org.apache.shiro.web.util.WebUtils; import com.lwj.modules.shiro.realm.Principal; /** * 首次登陆必须修改密码 * * @ClassName: ChangePasswordFilter * @author lwj * @version 1.0.0 */ public class ChangePasswordFilter extends AccessControlFilter { /** * 登录地址 */ static final String LOGIN_URL = "/login.html"; /** * 修改密码地址 */ static final String NEW_PASSWORD_URL = "/login/new_password.html"; @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { // TODO Auto-generated method stub return false; } @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { Subject subject = getSubject(request, response); if (subject.getPrincipal() == null) {// 表示没有登录,重定向到登录页面  saveRequest(request); WebUtils.issueRedirect(request, response, LOGIN_URL); } else { Principal principal = (com.lwj.modules.shiro.realm.Principal) subject.getPrincipal(); if (principal.getChangedPassword() == null || !principal.getChangedPassword()) { if (StringUtils.hasText(NEW_PASSWORD_URL)) {// 如果首次登录未修改密码,则跳转到修改密码页面  WebUtils.issueRedirect(request, response, NEW_PASSWORD_URL); } else { WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED); } } } return true; } }

补充Principal类,这个类在登录的时候用于用户的认证,相当于保存当前登录用户的基本信息。

package com.lwj.modules.shiro.realm;import java.io.Serializable;/** * * @Description :身份信息 * @author : lwj * @version : 1.0.0 * @Date :2016-11-13 11:21:56 */ public class Principal implements Serializable { /** 用户Cookie名称 */ public static final String USER_COOKIE_NAME = "u_c_n"; /** "身份信息"参数名称 */ public static final String PRINCIPAL_ATTRIBUTE_NAME = Principal.class.getName() + ".PRINCIPAL"; /** * */ private static final long serialVersionUID = 1L; /** ID */ private Integer id; /** 用户名 */ private String username;/** * 角色ID */ private Integer roleId;   /** * 登录IP */ private String ip;/** * 第一次登陆是否修改密码(平台) */ private Boolean changedPassword; /** * @param id * ID * @param username * 用户名 */ public Principal(Integer id, String username,Boolean changedPassword, Integer roleId, String ip) { this.id = id; this.username = username;     this.changedPassword = changedPassword; this.roleId = roleId;     this.ip = ip; } /** * 获取ID * * @return ID */ public Integer getId() { return id; } /** * 设置ID * * @param id * ID */ public void setId(Integer id) { this.id = id; } /** * 获取用户名 * * @return 用户名 */ public String getUsername() { return username; } /** * 设置用户名 * * @param username * 用户名 */ public void setUsername(String username) { this.username = username; } public Integer getRoleId() { return roleId; } public void setRoleId(Integer roleId) { this.roleId = roleId; }    public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; }

  public Boolean getChangedPassword() { return changedPassword; } public void setChangedPassword(Boolean changedPassword) { this.changedPassword = changedPassword; } }

配置shiro.xml

  <!-- 自定义shiro的filter --><bean id="changedPassword" class="com.lwj.modules.filter.ChangePasswordFilter" /> <!-- shiroFilter --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,这个属性是必须的 --> <property name="securityManager" ref="securityManager" /> <!-- 要求登录时的链接 --> <property name="loginUrl" value="/login.html" /> <!-- 登录成功后要跳转的链接 --> <property name="successUrl" value="/" /> <!-- 用户访问未对其授权的资源时,所显示的链接 --> <property name="unauthorizedUrl" value="/common/unauthorized.html" /> <property name="filterChainDefinitions"> <value><!-- 用户首次登录必须修改密码 --> /index/* = changedPassword /navigation/* = authc,changedPassword /** = authc </value> </property> <property name="filters"> <map> <entry key="changedPassword" value-ref="changedPassword" /> </map> </property> </bean>

转载于:https://www.cnblogs.com/But-you/p/10688048.html

shiro自定义过滤器相关推荐

  1. springboot项目中使用shiro 自定义过滤器和token的方式___shiro使用token登录流程

    springboot项目中使用shiro 自定义过滤器和token的方式 实现步骤主要是以下几步: 1. 在项目中导入maven依赖 <dependency><groupId> ...

  2. spingboot下shiro自定义过滤器roles

    shiro默认的roles过滤,是与的关系,就是你的用户得有roles对应的所有角色,才算有权限. 但是实际开发过程中,更多的是或的需求,只要用户满足roles中的一个角色,就算有权限. 所以就涉及到 ...

  3. shiro学习系列:shiro自定义filter过滤器

    shiro学习系列:shiro自定义filter过滤器 自定义JwtFilter的hierarchy(层次体系) 上代码 package com.finn.springboot.common.conf ...

  4. springboot+shiro自定义拦截器互踢问题

    shiro自定义拦截器继承AccessControllerFilter,实现session互踢机制. 应用场景: 我们经常会有用到,当A 用户在北京登录 ,然后A用户在天津再登录 ,要踢出北京登录的状 ...

  5. 【AngularJS】—— 9 自定义过滤器

    AngularJS另一个特点就是提供了过滤器,可以通过操作UNIX下管道的方式,操作数据结果. 通过使用管道,可以便于双向的数据绑定中视图的展现. 过滤器在处理过程中,将数据变成新的格式,而且可以使用 ...

  6. springboot过滤字段_SpringBoot自定义过滤器的两种方式及过滤器执行顺序

    第一种 @WebFilter + @ServletComponentScan 注解 1.首先自定义过滤器 如下自定义过滤器 ReqResFilter必须实现  javax.servlet.Filter ...

  7. Django 框架13: 自定义过滤器和标签

    2019独角兽企业重金招聘Python工程师标准>>> Django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足开发要求,如果觉得需更精准的模板标签或者过滤器,可以自 ...

  8. 2.选择元素 - 自定义过滤器《jquery实战》

    2.5.6 自定义过滤器 jQuery 中有两种方法创建自定义的过滤器.第一种比较简单,但是不鼓励,从 jQuery 1.8 开始已经被第二种方法取代.记住,使用新方法时,你自定义的过滤器在 jQue ...

  9. dubbo 自定义过滤器,打印接口调用信息

    dubbo提供了web filter类似的com.alibaba.dubbo.rpc.Filter,这样,我们可以在dubbo提供的服务提供方和消费方都可以自定义过滤 器,从而可以获得方法调用的时间或 ...

最新文章

  1. SSO单点登录之——JWT
  2. (四)协同过滤算法之基于用户的推荐算法python实现
  3. 对两个字符串进行比较,取出两个字符串中一样部分的长度
  4. javascript正则表达式入门
  5. pktgen:DPDK流量生成器
  6. php mysql blob存储图片_php mysql blob存储图片
  7. AppStore图片尺寸以及内容要求Screenshot specifications
  8. 一到九乘法口诀VB源码
  9. .NET中代理服务器WebProxy的各种用法
  10. 重要更新丨完成前端重构,KubeOperator开源容器平台v3.7.0发布
  11. java static 详解
  12. Excel中阳历转阴历
  13. sql server 经典练习题分享二
  14. 基于C++和QT实现的简单数独游戏软件
  15. muiapp开发07:自定义图标
  16. 仿潮自拍个人中心拖拉效果
  17. 修复谷歌浏览器翻译功能(win10)
  18. C语言基础 阶乘:输入一个数,输出它的阶乘。
  19. java第三方登录总结
  20. 工作中的设计模式 —— 策略模式

热门文章

  1. 开源SUP对接API卡盟程序卡信乐v2.0源码
  2. 单机android游戏排行榜,安卓单机手机游戏推荐_十大必玩单机手机游戏
  3. 如何PHP给人生日祝福,祝福偶像生日的句子 祝好朋友生日快乐说说
  4. 友源社区APP论坛源码+网站源码
  5. POS机移动刷卡机自适应网站源码 dedecms织梦模板
  6. WordPress内核站群全自动新闻采集发布源码,单站专用
  7. 阿里助手 5.12.2
  8. 盛辉智能机器人安全吗_人工智能真的安全吗?快看这些已经发出的警告
  9. 微信知识付费小程序博客源码(带299条数据)
  10. 标准盒子与IE盒子的区别