zoukankan      html  css  js  c++  java
  • Shiro登录成功之后跳到指定URL

    出自:http://www.cnblogs.com/sevenlin/p/sevenlin_shiro20150924.html

     通常我们使用shiro,登录之后就会跳到我们上一次访问的URL,如果我们是直接访问登录页面的话,shiro就会根据我们配置的successUrl去重定向,如果我们没有配置successUrl的话,那么shiro重定向默认的/,这个逻辑看shiro的源码就可以知道:

    1.shiro会把请求信息保存到session中:

     

    2.然后判断是否已经登录,如果没有登录,就会跳到登录页面,用户输入凭证之后就会交给FormAuthenticationFilter这个类来处理;

    3.如果登录成功之后就会调用一下方法重定向:

     

    其中的issueSuccessRedirect方法如下:

    FormAuthenticationFilter出来之后就会交给这个方法处理重定向:

     

        从上面就可以看出,shiro去session中找出之前的保存的请求,如果没有的话就会跳转到我们配置的successUrl!

     

         但是现实中往往有很多需求就是,要求我们登录成功之后要跳到一个固定的页面,通常是跳到首页,那这时候我们应该怎么做呢?

    通过查看源码,我发现在shiro的webUtils工具类中有这样一个方法:

     

    意思是,获取session中的请求信息,并且清理他;

    有了这个方法之后就好办了!

    我们可以重写FormAuthenticationFilter的onLoginSuccess方法,具体如下:

     

    public class MyFormAuthenticationFilter extends FormAuthenticationFilter{
        private Logger logger = LoggerFactory.getLogger(CaptchaFormAuthenticationFilter.class);
        public static final String DEFAULT_CAPTCHA_PARAM = "captcha";
        private String captchaParam = DEFAULT_CAPTCHA_PARAM;
        
        public String getCaptchaParam() {
            return captchaParam;
        }
        
        protected String getCaptcha(ServletRequest request) {
            return WebUtils.getCleanParam(request, getCaptchaParam());
        }
        
        @Override
        protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
            String captcha = getCaptcha(request);
            String username = getUsername(request);
            String password = getPassword(request);
            boolean rememberMe = isRememberMe(request);
            String host = getHost(request);
            if(true){
                try{
                    password =SecurityUtil.get().decrypt(password, SecurityUtil.get().getPublicArrayKey()).trim();//前端密码js解密
                    logger.debug("密码js解密成功!");
                }catch(Exception e){
                    logger.error("用户为"+username+"的密码js解密失败!", e);
                }
            }
            
            CaptchaUsernamePasswordToken authenticationToken= new CaptchaUsernamePasswordToken(username, 
                    password, rememberMe, host, captcha,(HttpServletRequest) request);
            return authenticationToken; 
        }
    
        /**
         * 思路:用户输入凭证之后就会交给FormAuthenticationFilter这个类来处理,如果登录成功之后就会调用onLoginSuccess()方法重定向,
         * 最后调用WebUtils.redirectToSavedRequest()方法,该方法中可以看出shiro去session中找出之前的保存的请求,
         * 如果没有的话就会跳转到我们配置的successUrl。
         * 解决办法:用户回话过期后,重新登录后会访问session保存的访问地址造成页面布局混乱,这里直接清除之前保存的session中保存的请求信息,并且清理它
         */
        @Override
        protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
                ServletResponse response) throws Exception {
            WebUtils.getAndClearSavedRequest(request);//清除之前的地址(跳转到登录页面之前要访问的地址)
            return super.onLoginSuccess(token, subject, request, response);
        }
    }

    这样,就实现了在交给shiro处理重定向的时候清理了session中保存的请求信息,这样的话,就可以我们指定的url传递进去,这样就实现了跳转到我们指定的页面;

    其次,要把我们定义的过滤器配置一下:

    注入:

     

    加到shiro过滤器链中:

     

    这样使用authc的时候就是我们自定一个过滤器了,如果觉得用同个名字不好也可以自己定义名字!

  • 相关阅读:
    记一次lvs-tunnel模式的故障分析(7)
    Zabbix实战-简易教程(4)--Server端安装
    Zabbix实战-简易教程(3)--DB安装和表分区
    HDFS跨外部存储系统的多层级存储
    HDFS副本放置节点选择的优化
    HDFS副本放置节点选择的优化
    HDFS的新方向:Ozone对象存储
    HDFS的新方向:Ozone对象存储
    聊聊HDFS中的副本放置策略和磁盘选择策略间的选择“矛盾”
    聊聊HDFS中的副本放置策略和磁盘选择策略间的选择“矛盾”
  • 原文地址:https://www.cnblogs.com/onlymate/p/8793986.html
Copyright © 2011-2022 走看看