一、针对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默认的工作流程简单举例说明:
  1. 第一种情况,用户在没登录的情况下,直接访问网站的内部路径,比如http://localhost:8080/ list.jsp,这时登录拦截器进行拦截该请求,发现用户没有登录,直接跳转到authc.loginUrl里设置的路径(如login.jsp),并且把这次请求的地址http://localhost:8080/ list.jsp也进行了保存,当系统跳转到login.jsp,用户成功登录后,会直接返回上次访问的list.jsp页面。
  2. 第二种情况,当用户直接请求登录,而不存在上次访问请求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,谢谢

针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题的更多相关文章

  1. struts2框架之拦截器(参考第二天学习笔记)

    拦截器 1. 什么是拦截器 1). 与JavaWeb中的Filter比较相似. 2). 拦截器只能拦截Action!!! 2. Struts中定义了很多拦截器,其中defaultStack中的拦截器会 ...

  2. Struts2透过自定义拦截器实现登录之后跳转到原页面

    Struts2通过自定义拦截器实现登录之后跳转到原页面 这个功能对用户体验来说是非常重要的.实现起来其实很简单. 拦截器的代码如下: package go.derek.advice; import g ...

  3. python作业设计:输入用户名密码,认证成功后显示欢迎信息,输错三次后锁定

    作业需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定实现思路: 1.判断用户是否在黑名单,如果在黑名单提示账号锁定. 2.判断用户是否存在,如果不存在提示账号不存在. 3.判 ...

  4. 【Shiro】调用doGetAuthenticationInfo进行认证成功之后,isAuthenticated是false的问题。

    使用@Configuration配置shiro无状态登录时出现的问题,在subject.login之后当前线程重新绑定了一个假定subject,isAuthenticated. 这里自定义的访问拦截器 ...

  5. 基于SSH2框架Struts2拦截器的登录验证实现(转)

        大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证.     修改数 ...

  6. 微信小程序 wepy框架 之拦截器intercepter使用

    1,在使用wepy框架创建的项目下 找到src/app.wpy 2,在app.wpy constructor方法中添加 super(); this.use('promisify');//启用ES6 p ...

  7. SSM整合AOP,日志框架和拦截器

    前言 日志是所有系统必不可少的部分,而AOP在MVC通常用于监控方法调用,可以生成一个traceid,记录从用户调用到底层数据库的数据链路,帮助监控和排查问题. AOP 现在做一个简单的前置切面,用来 ...

  8. SpringMVC框架05——拦截器

    1.拦截器概述 Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证.记录请求信息的 ...

  9. springmvc框架使用拦截器实现301永久重定向,其实用过滤器应该是更好

    做seo的朋友提出要求 所有不带www.的访问需要301到带www的域名,以集中权重 可以使用过滤器检查servername带不带www,也可以使用拦截器 不会配置过滤器,所以先用拦截器实现吧,不过我 ...

随机推荐

  1. Django Ajax的使用

    简介: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX ...

  2. 几种常见的Windows 服务器无法联网/无法连接远程桌面等故障解决方案

    SEO优化扫我一.服务器无法连接远程桌面 1.Ping不通IP,网站打不开,不可以远程连接.可能是服务器死机了,或者网络有问题,请尝试Web重启服务器或联系服务商确认. 2.Ping正常,网站可以打开 ...

  3. 排查 Azure 虚拟机的远程桌面连接问题

    与基于 Windows 的 Azure 虚拟机 (VM) 的远程桌面协议 (RDP) 连接可能会因各种原因而失败,使用户无法访问 VM. 问题可能出在 VM 上的远程桌面服务.网络连接或主计算机上的远 ...

  4. Docker-commit镜像提交

    docker commit:提交容器副本使之成为一个新的镜像 docker commit -a="作者名" -m="提交的描述信息" 容器id 新建的镜像名称: ...

  5. laravel入门-01

    创建laravel应用 laravel new app_name 使用 PHP 内置 web server 驱动我们的网站 cd xxx/public php -S localhost:port 查看 ...

  6. 尝试Office 2003 VSTO的开发、部署

    转载:http://www.cnblogs.com/oneivan/p/4243574.html 背景:一年前,某项目需要使用到Excel进行数据录入,考虑到很多用户还是使用XP+Office 200 ...

  7. 部署Docker distribution仓库

    环境准备: 下载docker yum文件 # wget -O /etc/yum.repos.d/aliyun.repo http://mirrors.aliyun.com/repo/Centos-7. ...

  8. @Autowired和@Resource注解的区别

    @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false.如果我们想使用按名称装配,可以结合@Qualifier注 ...

  9. 删除 maven仓库,更新失败的jar包命令

    set REPOSITORY_PATH=D:\maven_cpbsrem ص‎شعثرث÷...for /f "delims=" %%i in ('dir /b /s " ...

  10. linux下的线程学习(一)

    线程标识 #include<pthread.h> int pthread_equal(    //用于比较两个线程是否相等 pthread_t tid1, //线程id=tid1 pthr ...