一、针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题
首先,我们先来了解一下authc登录拦截器工作原理
authc拦截器有2个作用:
1>登录认证
请求进来时,拦截并判断当前用户是否登录了,如果已经登录了放行, 如果没有登录,跳转到authc.loginUrl属性配置的路径,注意:默认是/login.jsp
2>执行登录认证
请求进来时,如果请求的路径为authc.loginUrl属性配置的路径(没配置,默认是/login.jsp)时,如果当前用户没有登录,authc这个拦截器会尝试获取请求中的账号跟密码值,然后比对ini配置文件或者realm中的用户列表,如果比对正确,直接执行登录操作,反之,抛异常,跳转到authc.loginUrl指定的路径。
注意:请求中账号与密码必须固定为username 跟password, 如果需要改动必须额外指定,authc.usernameParam=xxx authc.passwordParam=xxxx
authc默认的工作流程简单举例说明:
- 第一种情况,用户在没登录的情况下,直接访问网站的内部路径,比如http://localhost:8080/ list.jsp,这时登录拦截器进行拦截该请求,发现用户没有登录,直接跳转到authc.loginUrl里设置的路径(如login.jsp),并且把这次请求的地址http://localhost:8080/ list.jsp也进行了保存,当系统跳转到login.jsp,用户成功登录后,会直接返回上次访问的list.jsp页面。
- 第二种情况,当用户直接请求登录,而不存在上次访问请求url时,用户登录成功后就会跳转到 / 根目录
解决方法:
1.编写一个类 LoginFormAuthenticationFilter继承 FormAuthenticationFilter,重写onLoginSuccess方法
import org.apache.log4j.Logger; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.subject.Subject; import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; import org.apache.shiro.web.util.WebUtils; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class LoginFormAuthenticationFilter extends FormAuthenticationFilter { protected final Logger logger = Logger.getLogger(LoginFormAuthenticationFilter.class); @Override protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception { boolean contextRelative = true; String successUrl = this.getSuccessUrl(); if ("".equals(successUrl)) { successUrl = DEFAULT_SUCCESS_URL; } WebUtils.issueRedirect(request, response, successUrl, null, contextRelative); return false; } } |
2.在shiro.xml中配置该类
<bean id="loginFormAuthenticationFilter" class="xxx.xxxx.xxxx.LoginFormAuthenticationFilter" />(根据自己的路径来) |
3.在shiroFilter中配置属性filters
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="filters"> <map> <entry key="authc" value-ref="loginFormAuthenticationFilter"/> </map> </property> |
4.测试成功
二、针对shiro框架logout注销成功后跳转到根目录,而非指定页面问题
Logout自定义路径解决方案:
1.编写action
@RequestMapping("/logout") public String logout(HttpServletRequest request) { SecurityUtils.getSubject().logout(); // session删除、RememberMe cookie // 也将被删除 return InternalResourceViewResolver.REDIRECT_URL_PREFIX + "/login.jsp"; } |
2.编写SystemLogoutFilter类,继承LogoutFilter,重写preHandle方法
public class SystemLogoutFilter extends LogoutFilter { @Override protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { //在这里执行退出系统前需要清空的数据 Subject subject=getSubject(request,response); String redirectUrl=getRedirectUrl(request,response,subject); ServletContext context= request.getServletContext(); try { subject.logout(); context.removeAttribute("error"); }catch (SessionException e){ e.printStackTrace(); } issueRedirect(request,response,redirectUrl); return false; } } |
3.shiro.xml文件中配置
<bean id="systemLogoutFilter" class="xxxx.xxx.xxxx.SystemLogoutFilter">(自己的包路径) <property name="redirectUrl" (固定的属性名)value="/login.do"></property> (自定义路径) </bean> |
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="filters"> <map> <entry key="logout" value-ref="systemLogoutFilter"></entry> </map> </property> |
4.测试成功
ps:文档博主自己整理的,内容有参考,代码测试通过.
转载请注明出处https://www.cnblogs.com/ashery/p/9839870.html,谢谢
转载于:https://www.cnblogs.com/ashery/p/9839870.html