资料中,最终完整版的代码,AdminFilter有问题

资料中,最终完整版的代码,AdminFilter有问题

  1. 在用管理员登录之后,访问后台订单列表的时候,依然提示需要登录,打断点发现管理员登录成功之后明明绑定了session,但是session中绑定的user为null


http://img1.sycdn.imooc.com//climg/6048bbad09650e0308610948.jpg

http://img1.sycdn.imooc.com//climg/6048bddd09a1de3910680520.jpg


http://img1.sycdn.imooc.com//climg/6048bb9609acd9c424881002.jpg

2.管理员登录之后,访问添加商品接口,session中绑定的user就不为null,很奇怪

下图是添加商品类别过程的截图

http://img1.sycdn.imooc.com//climg/6048bcbd09a6d80e13050725.jpg

http://img1.sycdn.imooc.com//climg/6048be0e0998f04c12950585.jpg


http://img1.sycdn.imooc.com//climg/6048bc9e09cee2ce17840780.jpg


以下是代码

管理员登录之后绑定session

相关代码:

/**
* 管理员登录接口
*/
@PostMapping("/adminLogin")
@ResponseBody
public ApiRestResponse adminLogin(@RequestParam("userName") String userName,
@RequestParam("password") String password, HttpSession session)
throws ImoocMallException {
if (StringUtils.isEmpty(userName)) {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_USER_NAME);
}
if (StringUtils.isEmpty(password)) {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_PASSWORD);
}
User user = userService.login(userName, password);
//校验是否是管理员
if (userService.checkAdminRole(user)) {
//是管理员,执行操作
//保存用户信息时,不保存密码
user.setPassword(null);
session.setAttribute(Constant.IMOOC_MALL_USER, user);
return ApiRestResponse.success(user);
} else {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_ADMIN);
}
}

AdminFilter代码

相关代码:

package com.imooc.mall.filter;

import com.imooc.mall.common.ApiRestResponse;
import com.imooc.mall.common.Constant;
import com.imooc.mall.exception.ImoocMallExceptionEnum;
import com.imooc.mall.model.pojo.Category;
import com.imooc.mall.model.pojo.User;
import com.imooc.mall.service.UserService;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

/**
* 描述: 管理员校验过滤器
*/
public class AdminFilter implements Filter {

@Autowired
UserService userService;

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = request.getSession();
User currentUser = (User) session.getAttribute(Constant.IMOOC_MALL_USER);
if (currentUser == null) {
PrintWriter out = new HttpServletResponseWrapper(
(HttpServletResponse) servletResponse).getWriter();
out.write("{\n"
+ " \"status\": 10007,\n"
+ " \"msg\": \"NEED_LOGIN\",\n"
+ " \"data\": null\n"
+ "}");
out.flush();
out.close();
return;
}
//校验是否是管理员
boolean adminRole = userService.checkAdminRole(currentUser);
if (adminRole) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
PrintWriter out = new HttpServletResponseWrapper(
(HttpServletResponse) servletResponse).getWriter();
out.write("{\n"
+ " \"status\": 10009,\n"
+ " \"msg\": \"NEED_ADMIN\",\n"
+ " \"data\": null\n"
+ "}");
out.flush();
out.close();
}
}

@Override
public void destroy() {

}
}

AdminFilterConfig代码

相关代码:

package com.imooc.mall.config;

import com.imooc.mall.filter.AdminFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* 描述: Admin过滤器的配置
*/
@Configuration
public class AdminFilterConfig {

@Bean
public AdminFilter adminFilter() {
return new AdminFilter();
}

@Bean(name = "adminFilterConf")
public FilterRegistrationBean adminFilterConfig() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(adminFilter());
filterRegistrationBean.addUrlPatterns("/admin/category/*");
filterRegistrationBean.addUrlPatterns("/admin/product/*");
filterRegistrationBean.addUrlPatterns("/admin/order/*");
filterRegistrationBean.setName("adminFilterConf");
return filterRegistrationBean;
}
}


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,测试同学的代码,也没有出现同学描述的问题。两个session是相同,如:

http://img1.sycdn.imooc.com//climg/6049ec1b09ccd7a409720462.jpg

http://img1.sycdn.imooc.com//climg/6049ec560935b2e309680454.jpg


另外分页查询没有实现。查询第2页数据,每页显示3条,结果查询到所有的13条数据,如:

http://img1.sycdn.imooc.com//climg/6049ecbb0909a76106320631.jpg

建议同学检查一下postman测试时,登录和后台列表的ip和端口是否相同,cookie中的JSESSION是否相同,如:

http://img1.sycdn.imooc.com//climg/6049eded095ecdfe06700224.jpg

http://img1.sycdn.imooc.com//climg/6049ee29091eafce06440179.jpg

http://img1.sycdn.imooc.com//climg/6049ee5209f3c7c606800130.jpg

http://img1.sycdn.imooc.com//climg/6049ee5c090a2e2e06610174.jpg

或者同学可以重新创建一个request再试试。

祝学习愉快~

好帮手慕阿满 2021-03-11 11:16:41

同学你好,这边测试最终完整版的代码,并没有出现同学所描述的问题。替换同学贴出来的代码也没有出现同学描述的问题。当管理员登录后,直接访问后台是可以查询到订单列表的,如:

http://img1.sycdn.imooc.com//climg/60498aca09bab1a205930701.jpg

http://img1.sycdn.imooc.com//climg/60498adf097eb96406530703.jpg

同学可以在管理员登录中打上断点,查看user是否有值,是否将user存入了session,如:

http://img1.sycdn.imooc.com//climg/60498b71095e22ca10880571.jpg

祝学习愉快~


  • 提问者 Bluse666 #1

    1.session绑定的有,但是我发现这不是同一个session啊,见鬼了,这是什么原因呢?

    http://img1.sycdn.imooc.com//climg/6049d56909096e4a18810731.jpg


    http://img1.sycdn.imooc.com//climg/6049d5760926f26b17860883.jpg


    2.这样解决问题太浪费时间了,给个邮箱我把代码打包发给你

    2021-03-11 16:35:40
  • 提问者 Bluse666 #2

    找到问题了,请求一个是localhost,一个是127.0.0.1,这两个还不一样吗?

    2021-03-11 19:27:48
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师