一、实现需求
登录框架采用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>