2.7显示登录信息

登录信息

使用拦截器

应用拦截器:耦合度低
在请求开始时查询登录用户
在本次请求中持有用户数据
在模板视图上显示用户数据
在请求结束中国清理用户数据

使用案例case

坑:如果加拦截器会直接说无法解析 {**}路径,但是去掉并不会影响,去掉拦截静态资源会有影响,会导致退出账户有问题!!
解决:不知道为啥,把两个* 替换成一个* 就可以了

逻辑流程

1.写ticket的拦截器,里面对应的有cookie的工具类(用于拿去cookie凭证),还有个有hostholder(用于持有用户的信息,用于代替session对象(线程隔离的,我们再开发中不太想用session对象)),在下面的postHandle中,通过hostHolder拿到user,传回model中。


@Component
public class LoginTicketInterceptor implements HandlerInterceptor {

    @Autowired
    private UserService userService;

    @Autowired
    private HostHolder hostHolder;

    @Override
    //prehandle,在controller之前使用
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取cookie中的凭证
        String ticket = CookieUtil.getValue(request, "ticket");
        if (ticket != null) {
            //登录了
            LoginTicket loginTicket = userService.findLoginTicket(ticket);
            //判断凭证现在是否有效
            if (loginTicket != null && loginTicket.getStatus() == 0 && loginTicket.getExpired().after(new Date())) {
                //有效
                //根据凭证查询用户
                User user = userService.findUserById(loginTicket.getUserId());
                //在本次请求当中持有用户
                hostHolder.setUsers(user);
            }
        }
        return true;
    }

    //在模板引擎调用之前,返回的是loginUser的模板信息给model,让它能在前端使用
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        User user = hostHolder.getUser();
        if (user!=null && modelAndView !=null){
            modelAndView.addObject("loginUser",user);
        }
    }
}

2.写拦截器对应的配置类,用InterceptorRegistry 这个对象实现拦截,记得注入之前写的拦截器。


@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private AlphaInterceptor alphaInterceptor;

    @Autowired
    private LoginTicketInterceptor loginTicketInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //这里用exclude拦截css出错。
//        registry.addInterceptor(alphaInterceptor)
//                .addPathPatterns("/register", "/login");

        registry.addInterceptor(loginTicketInterceptor)
                .excludePathPatterns("/*/*.css", "/*/*.js", "/*/*.png", "/*/*.jpg", "/*/*.jpeg");;
    }

}

3.在前端页面根据需要把model中的数据导入

					<div class="collapse navbar-collapse" id="navbarSupportedContent">
						<ul class="navbar-nav mr-auto">
							<li class="nav-item ml-3 btn-group-vertical">
								<!--/ 表示绝对路径 不加就是相对路径-->
								<a class="nav-link" th:href="@{/index}">首页</a>
							</li>
							<li class="nav-item ml-3 btn-group-vertical" th:if="${loginUser!=null}">
								<a class="nav-link position-relative" th:href="@{/letter/list}">消息<span class="badge badge-danger" th:text="${allUnreadCount!=0?allUnreadCount:''}">12</span></a>
							</li>
							<li class="nav-item ml-3 btn-group-vertical" th:if="${loginUser==null}">
								<a class="nav-link" th:href="@{/register}">注册</a>
							</li>
							<li class="nav-item ml-3 btn-group-vertical" th:if="${loginUser==null}">
								<a class="nav-link" th:href="@{/login}">登录</a>
							</li>
							<li class="nav-item ml-3 btn-group-vertical dropdown" th:if="${loginUser!=null}">
								<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
									<img th:src="${loginUser.headerUrl}" class="rounded-circle" style="width:30px;"/>
								</a>
								<div class="dropdown-menu" aria-labelledby="navbarDropdown">
									<a class="dropdown-item text-center" th:href="@{|/user/profile/${loginUser.id}|}">个人主页</a>
									<a class="dropdown-item text-center" th:href="@{/user/setting}">账号设置</a>
									<a class="dropdown-item text-center" th:href="@{/logout}">退出登录</a>
									<div class="dropdown-divider"></div>
									<span class="dropdown-item text-center text-secondary" th:utext="${loginUser.username}">nowcoder</span>
								</div>
							</li>
						</ul>
						<!-- 搜索 -->
						<form class="form-inline my-2 my-lg-0" action="site/search.html">
							<input class="form-control mr-sm-2" type="search" aria-label="Search" />
							<button class="btn btn-outline-light my-2 my-sm-0" type="submit">搜索</button>
						</form>
					</div>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值