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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM