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的时候就是我们自定一个过滤器了,如果觉得用同个名字不好也可以自己定义名字!

  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/onlymate/p/8793986.html
Copyright © 2011-2022 走看看