生活随笔
收集整理的這篇文章主要介紹了
shiro扩展获得用户登录类型并提供cookie的方式记住用户密码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在最近的項目中要實現一個需求:“同時讓兩種類型的用戶進行登錄,登錄后如果用戶勾選了記住密碼就要生成cookie來記錄用戶的密碼和用戶名”。本人做安全認證的時候一直在使用shiro,所以就想到在shiro的基礎上進行一些擴展來滿足需求。
shiro自帶的參數中有三個值,分別是username、password和rememberme,而自帶的rememberme使用的時候并沒有生成自定義cookie的能力,所以只能擴展一個自己的remember么來實現功能了。
代碼如下:
import org.apache.shiro.authc.UsernamePasswordToken;
/**首先要擴展shiro默認提供的usernamePasswordToken,加入我們需要關心的字段*/
public class UserNamePassWordCookieToken extends UsernamePasswordToken {private static final long serialVersionUID = 1L;private boolean isRemember;//是否記住密碼private String loginType;//0為企業用戶,1為政務端用戶public UserNamePassWordCookieToken(String username, char[] password,boolean rememberMe, String host, boolean isRemember,String loginType) {super(username, password, rememberMe, host);this.setRemember(isRemember);this.loginType=loginType;}public boolean isRemember() {return isRemember;}public void setRemember(boolean isRemember) {this.isRemember = isRemember;}public String getLoginType() {return loginType;}public void setLoginType(String loginType) {this.loginType = loginType;}}
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;/**我使用的 是表單驗證,所以這里擴展一下默認的FormAuthenticationFilter*/
public class FormAuthenticationCookieFilter extends FormAuthenticationFilter {public static final String DEFAULT_CAPTCHA_PARAM = "ck_rmbUser";//自定義的rememberme在form表單中的namepublic static final String DEFAULT_LOGINTYPE_PARAM = "loginType";//自定義的登錄類型在form表單中的nameprivate String isRememberParam = DEFAULT_CAPTCHA_PARAM;private String loginTypeParam = DEFAULT_LOGINTYPE_PARAM;public String getIsRememberParam() {return isRememberParam;}public void setIsRememberParam(String isRememberParam) {this.isRememberParam = isRememberParam;}public String getLoginTypeParam() {return loginTypeParam;}public void setLoginTypeParam(String loginTypeParam) {this.loginTypeParam = loginTypeParam;}protected boolean getIsRemember(ServletRequest request) {return WebUtils.isTrue(request, getIsRememberParam());//利用shiro的工具類來把form表單傳來的isRemember轉換為boolean值}protected String getLoginType(ServletRequest request) {return WebUtils.getCleanParam(request, getLoginTypeParam());//利用shiro的工具類獲得登錄類型}protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {String username = getUsername(request);String password = getPassword(request);boolean isRemember = getIsRemember(request);String loginType = getLoginType(request);HttpServletRequest httpServletReqrest = (HttpServletRequest) request;HttpServletResponse httpServletResponse = (HttpServletResponse) response;try {if (isRemember) {//創建cookieCookie user = new Cookie("user", username + "-" + password+ "-" + loginType);// user.setMaxAge(60);user.setMaxAge(365*24*60*60);httpServletResponse.addCookie(user);} else {//清除cookieCookie[] cookies = httpServletReqrest.getCookies();for (Cookie cookie : cookies) {if (cookie.getName().equals("user")) {cookie.setValue(null);cookie.setMaxAge(0);// 立即銷毀cookieSystem.out.println("被刪除的cookie名字為:" + cookie.getName());httpServletResponse.addCookie(cookie);break;}}}} catch (Exception e) {e.printStackTrace();}boolean rememberMe = isRememberMe(request);//shiro自帶的rememberString host = getHost(request);return new UserNamePassWordCookieToken(username,password.toCharArray(), rememberMe, host, isRemember, loginType);}}
總結
以上是生活随笔為你收集整理的shiro扩展获得用户登录类型并提供cookie的方式记住用户密码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。