欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證

 更新時(shí)間:2017年03月17日 14:34:42   作者:饑渴計(jì)科極客杰鏗  
本篇文章主要介紹了JavaWeb使用Session和Cookie實(shí)現(xiàn)登錄認(rèn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

后臺(tái)管理頁面往往需要登錄才可以進(jìn)行操作,這時(shí)就需要Seession來記錄登錄狀態(tài)

要實(shí)現(xiàn)起來也是非常簡(jiǎn)單,只需要自定義一個(gè)HandlerInterceptor就行了

自定義的HandlerInterceptor也只有短短幾行代碼

public class LoginInterceptor implements HandlerInterceptor {

  @Override
  public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object obj, Exception err)
      throws Exception {
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response,
              Object obj, ModelAndView mav) throws Exception {

  }

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
               Object obj) throws Exception {
    //獲取session里的登錄狀態(tài)值
    String str = (String) request.getSession().getAttribute("isLogin");
    //如果登錄狀態(tài)不為空則返回true,返回true則會(huì)執(zhí)行相應(yīng)controller的方法
    if(str!=null){
      return true;
    }
    //如果登錄狀態(tài)為空則重定向到登錄頁面,并返回false,不執(zhí)行原來controller的方法
    response.sendRedirect("/backend/loginPage");
    return false;
  }
}

Controller代碼

@Controller
@RequestMapping("/backend")
public class BackendController {

  @RequestMapping(value = "/loginPage", method = {RequestMethod.GET})
  public String loginPage(HttpServletRequest request,String account, String password){
    return "login";
  }

  @RequestMapping(value = "/login", method = {RequestMethod.POST})
  public String login(HttpServletRequest request,RedirectAttributes model, String account, String password){
    //驗(yàn)證賬號(hào)密碼,如果符合則改變session里的狀態(tài),并重定向到主頁
    if ("jack".equals(account)&&"jack2017".equals(password)){
      request.getSession().setAttribute("isLogin","yes");
      return "redirect:IndexPage";
    }else {
      //密碼錯(cuò)誤則重定向回登錄頁,并返回錯(cuò)誤,因?yàn)槭侵囟ㄏ蛩玫絉edirectAttributes
      model.addFlashAttribute("error","密碼錯(cuò)誤");
      return "redirect:loginPage";
    }
  }
  //登出,移除登錄狀態(tài)并重定向的登錄頁
  @RequestMapping(value = "/loginOut", method = {RequestMethod.GET})
  public String loginOut(HttpServletRequest request) {
    request.getSession().removeAttribute("isLogin");
    return "redirect:loginPage";
  }
  @RequestMapping(value = "/IndexPage", method = {RequestMethod.GET})
  public String IndexPage(HttpServletRequest request){
    return "Index";
  }

}

spring的配置

  <!--省略其他基本配置-->

  <!-- 配置攔截器 -->
  <mvc:interceptors>
    <!-- 配置登陸攔截器 -->
    <mvc:interceptor>
      <!--攔截后臺(tái)頁面的請(qǐng)求-->
      <mvc:mapping path="/backend/**"/>
      <!--不攔截登錄頁和登錄的請(qǐng)求-->
      <mvc:exclude-mapping path="/backend/loginPage"/>
      <mvc:exclude-mapping path="/backend/login"/>
      <bean class="com.ima.Interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
  </mvc:interceptors>

一個(gè)簡(jiǎn)單的Session實(shí)現(xiàn)登錄認(rèn)證系統(tǒng)就這樣完成了,如果想登錄狀態(tài)退出瀏覽器后仍保留一段時(shí)間的可以將Session改為Cookie

一般情況下我們都會(huì)使用Cookie

Cookie和Session的方法差不多

使用Cookie的自定義HandlerInterceptor

public class LoginInterceptor implements HandlerInterceptor {

  @Override
  public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object obj, Exception err)
      throws Exception {
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response,
              Object obj, ModelAndView mav) throws Exception {

  }

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
               Object obj) throws Exception {
//    獲取request的cookie
    Cookie[] cookies = request.getCookies();
    if (null==cookies) {
      System.out.println("沒有cookie==============");
    } else {
//      遍歷cookie如果找到登錄狀態(tài)則返回true執(zhí)行原來controller的方法
      for(Cookie cookie : cookies){
        if(cookie.getName().equals("isLogin")){
          return true;
        }
      }
    }
//    沒有找到登錄狀態(tài)則重定向到登錄頁,返回false,不執(zhí)行原來controller的方法
    response.sendRedirect("/backend/loginPage");
    return false;
  }
}

Controller的變化也不大

@Controller
@RequestMapping("/backend")
public class BackendController {

  @RequestMapping(value = "/loginPage", method = {RequestMethod.GET})
  public String loginPage(HttpServletRequest request, String account, String password) {
    return "login";
  }

  @RequestMapping(value = "/login", method = {RequestMethod.POST})
  public String login(HttpServletRequest request, HttpServletResponse response, RedirectAttributes model, String account, String password) {
    if ("edehou".equals(account) && "aidou2017".equals(password)) {
      Cookie cookie = new Cookie("isLogin", "yes");
      cookie.setMaxAge(30 * 60);// 設(shè)置為30min
      cookie.setPath("/");
      response.addCookie(cookie);
      return "redirect:IndexPage";
    } else {
      model.addFlashAttribute("error", "密碼錯(cuò)誤");
      return "redirect:loginPage";
    }
  }

  @RequestMapping(value = "/logOut", method = {RequestMethod.GET})
  public String loginOut(HttpServletRequest request, HttpServletResponse response) {
    Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
      if (cookie.getName().equals("isLogin")) {
        cookie.setValue(null);
        cookie.setMaxAge(0);// 立即銷毀cookie
        cookie.setPath("/");
        response.addCookie(cookie);
        break;
      }
    }
    return "redirect:loginPage";
  }

  @RequestMapping(value = "/IndexPage", method = {RequestMethod.GET})
  public String IndexPage(HttpServletRequest request) {
    return "Index";
  }

}

spring的配置和之前的一模一樣

注意

這里只是演示,建議在實(shí)際項(xiàng)目中Cookie的鍵和值要經(jīng)過特殊處理,否則會(huì)引發(fā)安全問題

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中final關(guān)鍵字的用法總結(jié)

    Java中final關(guān)鍵字的用法總結(jié)

    在Java中,final可以別用來修飾類、修飾方法、修飾變量和修飾參數(shù)等,這里就來簡(jiǎn)單作一個(gè)Java中final關(guān)鍵字的用法總結(jié):
    2016-06-06
  • springboot中如何使用自定義兩級(jí)緩存

    springboot中如何使用自定義兩級(jí)緩存

    本話題主要就是討論如何在springboot的基礎(chǔ)上,無縫集成ehcache和redis作為一二級(jí)緩存,并且實(shí)現(xiàn)緩存同步。
    2021-05-05
  • Java Bean與Map之間相互轉(zhuǎn)化的實(shí)現(xiàn)方法

    Java Bean與Map之間相互轉(zhuǎn)化的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java Bean與Map之間相互轉(zhuǎn)化的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • java編程之基于SpringBoot框架實(shí)現(xiàn)掃碼登錄

    java編程之基于SpringBoot框架實(shí)現(xiàn)掃碼登錄

    本文將介紹基于SpringBoot + Vue + Android實(shí)現(xiàn)的掃碼登錄demo的總體思路,文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Java連接MySQL數(shù)據(jù)庫(kù)并實(shí)現(xiàn)數(shù)據(jù)交互功能

    Java連接MySQL數(shù)據(jù)庫(kù)并實(shí)現(xiàn)數(shù)據(jù)交互功能

    在現(xiàn)代應(yīng)用中,數(shù)據(jù)庫(kù)是不可或缺的一部分,Java 作為一種廣泛使用的編程語言,提供了豐富的 API 來與各種數(shù)據(jù)庫(kù)進(jìn)行交互,本文將詳細(xì)介紹如何在 Java 中連接 MySQL 數(shù)據(jù)庫(kù),并實(shí)現(xiàn)基本的數(shù)據(jù)交互功能,需要的朋友可以參考下
    2024-10-10
  • Java設(shè)計(jì)模式之原型模式的示例詳解

    Java設(shè)計(jì)模式之原型模式的示例詳解

    原型模式(Prototype Pattern)指使用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。本文將通過案例詳細(xì)講解一下原型模式,感興趣的可以了解一下
    2022-02-02
  • Java實(shí)現(xiàn)STL中的全排列函數(shù)next_permutation()

    Java實(shí)現(xiàn)STL中的全排列函數(shù)next_permutation()

    在算法競(jìng)賽中,全排列問題是一個(gè)經(jīng)典且常見的題目,傳統(tǒng)的遞歸方法在處理較大的n時(shí)會(huì)遇到堆棧內(nèi)存限制的問題,本文介紹了一種避免遞歸,使用next_permutation函數(shù)實(shí)現(xiàn)全排列的方法,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 關(guān)于Java反編譯字節(jié)碼文件

    關(guān)于Java反編譯字節(jié)碼文件

    將高級(jí)語言翻譯成匯編語言或機(jī)器語言的過程Java語言中的編譯一般指將Java文件轉(zhuǎn)換成class文件顧名思義反編譯就是編譯的逆向過程其實(shí)我們常用的開發(fā)工具(例如:IDEA、Eclipse)都帶有反編譯功能,需要的朋友可以參考下
    2023-05-05
  • java設(shè)計(jì)模式之工廠方法詳解

    java設(shè)計(jì)模式之工廠方法詳解

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之工廠方法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java中通過jsch來連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令

    Java中通過jsch來連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令

    這篇文章主要介紹了Java中通過jsch來連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令的相關(guān)資料,需要的朋友可以參考下
    2016-03-03

最新評(píng)論