一、實現需求
登錄框架采用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>