Spring security/Shiro ---登陆成功后返回登陆前界面<页面重定向>

Spring security ---登陆成功后返回登陆前界面<页面重定向>

问题:在登陆/退出成功后,我们往往通过http.formLogin().successForwardUrl()http.logout().logoutSuccessUrl()设定操作成功后的回跳页面。我们现在希望在任意界面跳转到登陆界面后,一旦登录成功便会返回登陆前的界面。
解决方法:我们自定义一个过滤器,在Spring security将当前页面(假设为P)重定向到登录页面之前,先将当前页面P的url存入对应的Bean中,在登陆完成后,再通过controller直接重定向到原页面P。
一、自定义全局参数

@Configuration
public class ParameterConfiguration {@Bean(name = "urlPath")public urlPathBean urlPath(){return new urlPathBean("test");		//urlPath作为全局参数}}
@AllArgsConstructor			//这里使用lombok添加构造方法和set,get方法
@NoArgsConstructor
@Data
public class urlPathBean {public String urlPath;
}

二、自定义filter
因为Filter初始化在注入Bean之前,所以我们不能使用@AutoWired这种方式进行注入。
这里我们需要一个自定义的SpringUtils类负责从Spring容器中取得Bean;

/*** @author yqb* @date 2018年9月29日* @version 1.0*/
@Component
public class SpringUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext)throws BeansException {if (SpringUtils.applicationContext == null) {SpringUtils.applicationContext = applicationContext;}}public static ApplicationContext getApplicationContext() {return applicationContext;}//根据namepublic static Object getBean(String name) {return getApplicationContext().getBean(name);}//根据类型public static <T> T getBean(Class<T> clazz) {return getApplicationContext().getBean(clazz);}public static <T> T getBean(String name, Class<T> clazz) {return getApplicationContext().getBean(name, clazz);}}

自定义过滤器

@WebFilter(urlPatterns = "/*",filterName = "channelFilter")
public class addBean implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httprequest = (HttpServletRequest) request;HttpServletResponse httpresponse= (HttpServletResponse) response;if(httprequest.getRequestURL().equals("你的待拦截URL")) {	urlPathBean urlPath = (urlPathBean) SpringUtils.getBean("urlPath");System.out.println("这里是过滤器"+httprequest.getRequestURL());urlPath.setUrlPath(httprequest.getRequestURL());		//urlPath存入跳转前的原页面}chain.doFilter(request,response);		//继续运行Spring security其他的过滤器}
}

需要给Springboot的入口函数添加注解:

@ServletComponentScan //扫描servlet注解,比如@webfilter @WebListener 建filter和listener注入servlet容器中

三、将过滤器加入到Spring security的过滤器链中
我们只需要将我们的过滤器加入到过滤器链的最前端,让我们的过滤器在页面跳转到登陆页面之前,优先记录下跳转前界面并存入urlPath这个Bean中即可。

http.addFilterBefore(new addBean(), WebAsyncManagerIntegrationFilter.class);

如下图,我们可以在Springboot的运行日志中看到,我们已经成功将addBean这个过滤器加入到了Spring security过滤器链的最前端。
在这里插入图片描述
四、Controller实现界面跳转
我这里设置的登陆成功后,都会跳转到transfer这个路径下。我们只需要在Controller中取得urlPath这个Bean中存放的原url路径,将页面引导至对应的界面即可。

	@RequestMapping("/transfer")public String welcom() {System.out.println("这里是controller:"+urlPath.getUrlPath());String temp = urlPath.getUrlPath();return temp;}

总结
在Spring security过滤器链中新增一个自定义过滤器,记录登陆前界面的url并存储到Bean中,当登陆成功时,通过Controller将页面重定向到Bean中记录的原界面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下编译的PHP添加soap扩展

# 进入源码cd /opt/php-5.5.17/# 进入扩展cd /ext/soap# PHP之前是编译好的&#xff0c;有phpize&#xff0c;用它生成configure文件。/usr/local/php-5.5.17/bin/phpize# 执行configure&#xff0c;之前编译好的PHP一定要有php-config./configure --with-php-config/usr/local…

针对plsql developer使用做的三个小设置

来自&#xff1a;http://www.cnblogs.com/william-lee/archive/2010/12/08/1900176.html 1、原来大家在sql窗口写多条sql语句&#xff0c;如果点击“执行”&#xff0c;那么会执行窗口下的所有语句&#xff0c;如果向执行所要的语句&#xff0c;必须选定它。 那么&#xff0c;有…

asp.net导出Excel类库

using System; using System.Collections.Generic; using System.Reflection; using System.Web; using Excel Microsoft.Office.Interop.Excel; /// <summary> ///ExcelClass 的摘要说明 /// </summary> public class ExcelClass { /// <su…

今天将Notebook还原了, 第一次外加了外围电路

因为天气太热了, 我的Aspire 5502出了问题, 用Ghost还原中途死机, 找了问题原来是太热了....又在宿舍, 没有空调, 又不想去图书馆, 最后就问奶仔借了部风扇, 总算搞掂了...相机太快了....看上去风扇好像停了....不仅有风扇, 它还要裸跑才能胜利还原....温度一高就自动关机了...…

SpringBoot生成日志文件---logback和log4j

SpringBoot生成日志文件---logback和log4j一、logbacklogback是SpringBoot自带的日志文件&#xff0c;默认会为控制台输出INFO级别的日志&#xff0c;并且不会将日志文件保存。如果我们只需要输出日志到文件&#xff0c;直接给application.yml中添加如下配置&#xff0c;对应日…

分清DB_NAME、INSTANCE_NAME、ORACLE_SID、SERVICE_NAME、DB_DOMAIN和GLOBAL_DB_NAME

Oracle安装前&#xff0c;首先要分清DB_NAME、INSTANCE_NAME、ORACLE_SID、SERVICE_NAME、DB_DOMAIN和GLOBAL_DB_NAME的概念。 一个运行着的ORACLE数据库就可以看成是一个ORACLE SERVER&#xff0c;该SERVER由数据库(Database)和实例(Instance)组成&#xff0c;在一般的情况下一…

几种经典的数据排序及其Java实现

选择排序 思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果&#xff1a; ①初始状态&#xff1a;无序区为R[1..n]&#xff0c;有序区为空。 ②第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k]&#xff0c;将它与无序区的第1个记录R[1]交换&#…

远见卓识,领导力在于把握企业潮流

凡是有人群的地方就有领导力&#xff0c;凡是有思想、有文化的地方就有领导力。经济学里&#xff0c;是在市场的意义上研究领导力&#xff1a;谁在引领价格变动的方式&#xff0c;谁在引领技术变化的潮流&#xff0c;谁在引导产品的发展趋势&#xff0c;这些都是领导力的概念。…

关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的

最近在做数据从Excel批量导入MSSQL时&#xff0c;传统的是使用Insert Into Table方法&#xff0c;不过这个方便比较慢 通过使用 SqlBulkCopy 可以批量导入到数据库。 默认批量导入数据库&#xff0c;需要DataTable的构架和MSSQL的表结构一样。但是使用ColumnMappings可以对列明…

VMware开启NAT模式/仅主机模式后主机ping不通虚拟机的问题

VMware开启NAT模式/仅主机模式后主机ping不通虚拟机的问题问题&#xff1a;VMware设置网络模式为NAT模式后&#xff0c;我们使用主机ping虚拟机无法联通&#xff0c;用虚拟机ping主机可以联通。 原因&#xff1a;这是由于虚拟机的IP网段与主机的VMnet8网段不一致所造成的。 解…

linux下 mysql 忘记root用户密码解决办法

一、以系统的root用户&#xff08;什么&#xff0c;你的系统的root用户密码也忘了。那只好看我另外一篇linux下忘记root用户的解决办法了先解决这个问题&#xff09;登陆系统&#xff0c;进入终端 [rootlocalhost /]# 二、杀掉mysql进程 方法1、[rootlocalhost /]#killall m…

OO设计原则总结

什么是设计原则&#xff1f; 设计原则是基本的工具&#xff0c;应用这些规则可以使你的代码更加灵活、更容易维护&#xff0c;更容易扩展。 基本原则封装变化Encapsulate what varies. 面向接口编程而非实现 Code to an interface rather than to an implementation.优先使用组…

kubectl get node运行时出现:Unable to connect to the server: x509: certificate signed by unknown authority

kubectl get nodes运行时出现&#xff1a;Unable to connect to the server: x509: certificate signed by unknown authority原因&#xff1a;我们在运行kubeadm reset时&#xff0c;没有删除原先的$HOME/.kube文件导致新建的kubelet报错。实际上在kubeadm reset执行后&#x…

设置在VS2005的IDE中迅速打开xaml文件

设置在VS2005的IDE中迅速打开xaml文件 本人使用普通台式计算机做WPF开发&#xff0c;每次打开xaml的时候&#xff0c;都需要等半天&#xff0c;那叫一个慢呀&#xff0c;实在受不了。即使是一个新建的xaml文件&#xff0c;打开都慢。怎样解决VS2005的IDE中打开xaml文件慢的问题…

Git分支(远程)

1、远程分支的表示形式&#xff1a;远程仓库名称/分支名&#xff0c;如&#xff1a;origin/master&#xff1b;2、一次Git克隆会建立你自己的本地分支&#xff1a;master和远程分支&#xff1a;origin/master&#xff0c;它们都指向origin/master分支的最后一次提交&#xff1b…

kubeadm join时出现错误:[ERROR Port-10250]: Port 10250 is in use [ERROR FileAvailable--etc-kubernetes-pki

kubeadm join时出现错误&#xff1a;[ERROR Port-10250]: Port 10250 is in use&#xff1b;[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists初次使用kubeadm构建k8s集群&#xff0c;所以对子节点加入管理节点的过程认识不足&am…

cs文件中控制页面table的大小、title名称(.aspx)

1. title 控制HTML:<title id"mytitle" runat"server"></title> CS: protected System.Web.UI.HtmlControls.HtmlGenericControl mytitle;mytitle.InnerText "Hello World"; 2. 页面table 控制HTML:<TABLE idTabl…

TCP/IP详解学习笔记(2)-数据链路层

TCP/IP详解学习笔记(2)-数据链路层数据链路层有三个目的&#xff1a; 为IP模块发送和 接收IP数据报。 为ARP模块发送ARP请求和接收ARP应答。 为RARP发送RARP请 求和接收RARP应答ip大家都听说过。至于ARP和RARP&#xff0c;ARP叫做地址解析协议…

vi 按了ctrl+s怎么办

【转载】 手香的不得了 http://blog.sina.com.cn/lx987654321123456789 今天白痴了一把&#xff0c;用vi的时候&#xff0c;习惯性的用了ctrl-s&#xff0c;一下子僵掉了网上一查&#xff0c; 原来&#xff1a; CTRLS表示停止向终端停止输出; CTRLQ恢复向终端输出流. 严重bs自己…

POJ 1966 Cable TV Network (最大流最小割)

$ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手&#xff0c;但本就是冲着网络流来的&#xff0c;所以我们直接一点。这道题我们要让这个联通图断开&#xff0c;那么势必会有两个点变得不连通&#xff0c;这道题的数据范围很小&#xff0c;所以我们试着暴…