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

SpringBoot如何實現(xiàn)持久化登錄狀態(tài)獲取

 更新時間:2021年11月09日 15:18:41   作者:禿頂少女  
這篇文章主要介紹了SpringBoot 如何實現(xiàn)持久化登錄狀態(tài)獲取,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot 持久化登錄狀態(tài)獲取

1.編寫登錄的controller文件

寫入cookie

//登陸成功后
//...將用戶賬號信息存入數(shù)據(jù)庫中
//寫cookie,(因存入數(shù)據(jù)庫,無需寫入session了)
            response.addCookie(new Cookie("token",token));

2.編寫首頁Controller邏輯

@Controller
public class IndexController {
    @Autowired
    private UserMapper userMapper;
    @GetMapping("/")
    public String index(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        if (cookies != null){
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("token")){
                    String token = cookie.getValue();
                    System.out.println("準備進數(shù)據(jù)庫");
                    User user = userMapper.findByToken(token); //去數(shù)據(jù)庫尋找該token值的用戶信息
                    System.out.println(user.toString());
                    if(user != null){ //若找到了這個用戶信息
                        //寫進session,讓頁面去展示
                        request.getSession().setAttribute("user",user);
                    }
                    break;
                }
            }
        }
        return "index";
    }
}

3.運行測試,成功

SpringBoot 實現(xiàn)登錄登出,登錄態(tài)管理

賬戶模塊中必要的功能登錄登出,相信這個大家都經(jīng)常使用了。簡單介紹下在SpringBoot中的實現(xiàn)

先說下實現(xiàn)思路:

用戶名密碼存儲在數(shù)據(jù)庫中,前端發(fā)出請求,攔截器先檢測用戶有無登錄,若有登錄可直接請求接口。無需登錄就可請求的接口需要加@NoLogin自定義注解。若未登錄,前端跳轉(zhuǎn)到登錄頁面,調(diào)用登錄接口,系統(tǒng)在后臺驗證用戶名密碼,驗證通過將用戶信息存儲在redis中和線程上下文中。

1.設(shè)計表結(jié)構(gòu)

除了必要的用戶名 密碼 其他賬戶信息字段大家可根據(jù)自己系統(tǒng)需求添加。

CREATE TABLE `t_account` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT '姓名',
  `mobile` varchar(32) NOT NULL COMMENT '手機號',
  `identity` varchar(32) NOT NULL COMMENT '身份證號碼',
  `user_name` varchar(32) NOT NULL COMMENT '賬戶',
  `password` varchar(64) NOT NULL DEFAULT '' COMMENT '登錄密碼',
  `accept_region` bigint(20) NOT NULL COMMENT '受理中心(網(wǎng)點)編號',
  `status` int(11) NOT NULL DEFAULT '1' COMMENT '狀態(tài):  0 禁用,1 正常,9 刪除',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  `create_by` bigint(20) DEFAULT NULL COMMENT '創(chuàng)建人Id',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
  `update_by` bigint(20) DEFAULT NULL COMMENT '修改人Id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='C端網(wǎng)點人員賬戶表';

2.controller層

接收客戶端傳參,調(diào)用接口與數(shù)據(jù)庫信息匹配,匹配成功返回用戶信息。并且存儲到redis中,且以當(dāng)前回話sessionid為key,用戶信息為value。

@RestController
@RequestMapping(value = WebConstants.WEB_PREFIX + "/account")
@Api(tags = "Account", description = "賬戶模塊")
@NoAuth
public class AccountController { 
    @Autowired
    private AccountService accountService;
 
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    @PostMapping(value = "/login")
    @ApiOperation("登錄")
    public ResponseVo<AccountVo>login(@RequestBody LoginForm form, HttpServletRequest request,
                                      HttpServletResponse response)   {
 
        HttpSession session=request.getSession();
        AccountDto accountDto=accountService.login(form.getUserName(),form.getPassword());
        if(null==accountDto){
            throw new BizException("用戶名或密碼錯誤!");
        }
        redisTemplate.opsForValue().set(session.getId(), JSON.toJSONString(accountDto));
        AccountVo accountVo= BeanCopy.of(accountDto,new AccountVo()).copy(BeanUtils::copyProperties).get();
        accountVo.setAceptRegion(AcceptRegionEnum.getDescByValue(accountDto.getAceptRegion()));
        return ResponseVo.successResponse(accountVo);
    } 
 
    @Login
    @PostMapping(value = "/logout")
    @ApiOperation("登出")
    public ResponseVo logout(HttpServletRequest request,HttpServletResponse response){
        HttpSession session=request.getSession();
        session.invalidate();
        redisTemplate.delete(session.getId());
        return ResponseVo.successResponse();
    } 
}

3.創(chuàng)建請求攔截器

創(chuàng)建一個請求攔截器,用于檢測用戶登錄態(tài)。通過session_id檢測redis中有沒有用戶信息。如果存在則將用戶信息存儲當(dāng)前線程上下文中(用戶線程上下文實質(zhì)就是基于HashMap的緩存),便于后續(xù)使用。這一步也可以放在登錄成功后(這樣也更嚴謹)。

@Component
public class LoginInterceptor implements HandlerInterceptor { 
    private Logger logger= LoggerFactory.getLogger(LoginInterceptor.class);
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Class<?> clazz = handlerMethod.getBeanType();
        Method m = handlerMethod.getMethod();
 
        //需登錄才可以訪問的(預(yù)約核驗?zāi)K)
        if (clazz.isAnnotationPresent(NoLogin.class) || m.isAnnotationPresent(NoLogin.class)) {
            return true; 
        }
        HttpSession session=request.getSession();
            //檢測redis中是否含有sessionId
            String val=redisTemplate.opsForValue().get(session.getId());
            if(null!=val){
                logger.info(val);
                AccountDto accountDto= JSON.parseObject(val,AccountDto.class);
                AcceptRegionUserVistor vistor=new AcceptRegionUserVistor();
                BeanUtils.copyProperties(accountDto,vistor);
                AcceptRegionUserThreadContext.putSessionVisitor(vistor);
                return true;
            }else{
                response.setStatus(401);
                throw  new BizException("401","common.system.user.not.login");
            }        
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
    } 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
    }
} 

注冊攔截器:(注冊后的攔截器才會生效哦)

@Configuration
public class WebConfiguration extends WebMvcConfigurationSupport {    
    @Autowired
    private LoginInterceptor loginInterceptor;      
    /**
     * 攔截器配置
     *
     * @param registry 注冊類
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {        
        registry.addInterceptor(loginInterceptor).addPathPatterns(WebConstants.WEB_PREFIX + "/**"); 
        super.addInterceptors(registry);
    }
}

4.登出

獲取到當(dāng)前會話,清空回話信息,刪除redis中對應(yīng)sessionid的用戶信息。代碼見上第二段代碼logout方法。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Redis incr解決并發(fā)問題的操作

    使用Redis incr解決并發(fā)問題的操作

    這篇文章主要介紹了使用Redis incr解決并發(fā)問題的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 一文帶你掌握Java?SPI的原理和實踐

    一文帶你掌握Java?SPI的原理和實踐

    在Java中,我們經(jīng)常會提到面向接口編程,這樣減少了模塊之間的耦合,更加靈活,Java?SPI?(Service?Provider?Interface)就提供了這樣的機制,本文就來講講它的原理與具體使用吧
    2023-05-05
  • Java中增強for循環(huán)在一維數(shù)組和二維數(shù)組中的使用方法

    Java中增強for循環(huán)在一維數(shù)組和二維數(shù)組中的使用方法

    下面小編就為大家?guī)硪黄狫ava中增強for循環(huán)在一維數(shù)組和二維數(shù)組中的使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • Java 開發(fā)的幾個注意點總結(jié)

    Java 開發(fā)的幾個注意點總結(jié)

    這篇文章主要介紹了Java開發(fā)的幾個注意點的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Java中String類的常用方法總結(jié)

    Java中String類的常用方法總結(jié)

    java.lang.String?類代表字符串。Java程序中所有的字符串文字(例如"abc"?)都可以被看作是實現(xiàn)此類的實例。本文主要為大家介紹了String類的常用方法,需要的可以參考一下
    2022-11-11
  • 詳解Java兩種方式簡單實現(xiàn):爬取網(wǎng)頁并且保存

    詳解Java兩種方式簡單實現(xiàn):爬取網(wǎng)頁并且保存

    本篇文章主要介紹了Java兩種方式簡單實現(xiàn):爬取網(wǎng)頁并且保存 ,主要用UrlConnection、HttpClient爬取實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • spring 自動注入AutowiredAnnotationBeanPostProcessor源碼解析

    spring 自動注入AutowiredAnnotationBeanPostProcessor源碼解析

    這篇文章主要介紹了spring自動注入AutowiredAnnotationBeanPostProcessor源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • java 數(shù)據(jù)結(jié)構(gòu)并查集詳解

    java 數(shù)據(jù)結(jié)構(gòu)并查集詳解

    并查集是一種用來管理元素分組情況的數(shù)據(jù)結(jié)構(gòu)。并查集可以高效地進行如下操作。本文將通過Java實現(xiàn)并查集,感興趣的小伙伴可以了解一下
    2022-03-03
  • 詳解Java?中的函數(shù)式接口

    詳解Java?中的函數(shù)式接口

    這篇文章主要為大家介紹了Java中的函數(shù)式接口,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2021-12-12
  • flink?RichFunction之坑及解決

    flink?RichFunction之坑及解決

    這篇文章主要介紹了flink?RichFunction之坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論