shiro登录实现自定义路径跳转

一、实现需求

    登录框架采用shiro,需根据不同客户端类型实现相对应定义页面跳转。

二、登录页jsp表单

    <div class="input-prepend" title="Username" data-rel="tooltip">
    <span class="add-on"><i class="icon-user"></i></span>    <input type="text" id="username" name="username"  value="${username}" class="input-medium required"/>
    </div>
    <div class="clearfix"></div>

    <div class="input-prepend" title="Password" data-rel="tooltip">
    <span class="add-on"><i class="icon-lock"></i></span><input type="password" id="password" name="password" class="input-medium required"/>
    </div>
    <div class="clearfix"></div>

    <div><input type="hidden" id="clienttype" name="clienttype" value="pc"/></div>
                            
    <div class="input-prepend">
    <label class="checkbox" for="rememberMe"><input type="checkbox" id="rememberMe" name="rememberMe"/> 记住我<a  href="${ctx}/register">注册</a></label>
    </div>
    <div class="clearfix"></div>

    <p class="center span5">
    <button type="submit" class="btn btn-primary">登录</button>
    </p>

三、自定义过滤器类

    创建自定义过滤器LoginFormAuthenticationFilter,继承FormAuthenticationFilter。然后通过重写onLoginSuccess方法与WebUtils工具类,实现自定义跳转。

 

 1 public class LoginFormAuthenticationFilter extends FormAuthenticationFilter {
 2 
 3     private static Logger logger = LoggerFactory.getLogger(LoginFormAuthenticationFilter.class);
 4     
 5     @Override
 6     protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
 7             ServletResponse response) throws Exception {
 8         
 9         ShiroUser user = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
10         
11         if(user != null) {
12             HttpServletRequest req = (HttpServletRequest) request;
13             String clientType = (String) req.getParameter("clienttype");
14             logger.debug("[LOGIN]login success(user:" + user.loginName + ", client:" + clientType + ")");
15             if("pc".equals(clientType)) { // 请求方为pc,执行原方法
16                 return super.onLoginSuccess(token, subject, request, response);
17             } else { // 其他,根据类型跳转指定页面
18                 WebUtils.getAndClearSavedRequest(request); // 清除登录前请求路径
19                 String fallbackUrl = null;
20                 fallbackUrl = "/static/" + clientType + ".jsp"; // 自定义跳转界面
21                 WebUtils.redirectToSavedRequest(request, response, fallbackUrl);
22             }
23         }
24         return false;
25     }
26 }

四、修改shiro配置文件

    在applicationContext-shiro.xml中配置自定义过滤器。

    首先,修改beans元素属性;

    xmlns:util=http://www.springframework.org/schema/util

    xsi:schemaLocation:

    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd

    其次,修改shiroFilter内容,添加自定义过滤器属性。

 1     <!-- 请求分发过滤器 -->
 2     <bean id="loginDispacher" class="cn.com.mcfly.web.filter.LoginFormAuthenticationFilter"/>
 3     <!-- Shiro Filter -->
 4     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
 5         <property name="securityManager" ref="securityManager" />
 6         <property name="loginUrl" value="/login" />
 7         <property name="filters">
 8             <util:map>
 9                 <entry key="authc" value-ref="loginDispacher"/>
10             </util:map>
11         </property>
12         <!--<property name="successUrl" value="/" />-->
13         <property name="filterChainDefinitions">
14             <value>
15                 /static/** = anon
16                 /login = authc
17                 /logout = logout
18                 ...
19                 /** = user
20             </value>
21         </property>
22     </bean>
原文地址:https://www.cnblogs.com/fantastic-clouds/p/8028584.html