河南企业网站制作,wordpress教程视频 下载,苏州制作网页公司,项目管理系统软件开发Spring security ---登陆成功后返回登陆前界面页面重定向问题#xff1a;在登陆/退出成功后#xff0c;我们往往通过http.formLogin().successForwardUrl()和http.logout().logoutSuccessUrl()设定操作成功后的回跳页面。我们现在希望在任意界面跳转到登陆界面后页面重定向问题在登陆/退出成功后我们往往通过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添加构造方法和setget方法
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(ClassT clazz) {return getApplicationContext().getBean(clazz);}public static T T getBean(String name, ClassT 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中记录的原界面。