本题中的获取session,判断session中是否有用户数据,请问如何获取

本题中的获取session,判断session中是否有用户数据,请问如何获取

我已经在登录页面设置了sessionStorage变量,但是如何在Java拦截器中获取呢?

老师顺便看看我这样做的对不对?

拦截器代码

public class LoginInterceptor implements HandlerInterceptor {
    Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle拦截已开启");
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after拦截以开启");
        StringBuffer info = new StringBuffer();
        info.append(request.getRemoteAddr());
        info.append("|");
        info.append(request.getRequestURL());
        info.append("|");
        info.append(request.getHeader("user-agent"));
        logger.info(info.toString());
    }
}

登录后的页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    当前用户:${user.username} <a href="login.jsp">退出</a>
</body>
<script>
    let username = "${user.username}";
    let password = "${user.password}";
    sessionStorage.setItem('username', username);
    sessionStorage.setItem('password', password);
</script>
</html>

登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <div id="show">${info}</div>
    <form action="/login" method="post">
      用户名:<input type="text" name="username"><br>
      密 码:<input type="password" name="password"><br>
      <input type="submit" value="登录">
    </form>
</body>
</html>

Controller

@Controller
public class LoginController {
    @PostMapping("/login")
    public ModelAndView view(User user) {
        ModelAndView modelAndView = new ModelAndView();
        if (user.getUsername().equals("admin") && user.getPassword().equals("admin")) {
            modelAndView.setViewName("/main.jsp");
            modelAndView.addObject("user", user);
        } else {
            modelAndView.setViewName("/login.jsp");
            modelAndView.addObject("info", "用户名或密码错误,请重新登录!");
        }
        return modelAndView;
    }
}


正在回答

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

1回答

同学你好,1、一般情况下,并不会在前端页面设置session。建议同学在LoginController中设置session,然后在main.jsp页面中进行获取。

2、在拦截器中可以获取session信息的,同学可以先通过session判断用户是否登录,如果已登录,则将用户信息写入到日志中。参考代码如下所示:

import com.imooc.restful.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
    //1.创建日志对象,并加载当前类
    Logger logger= LoggerFactory.getLogger(LoginInterceptor.class);
    //拦截器, 对登录的用户拦截判断,已登录的放行,未登录的响应回去先登录
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(request.getRequestURI());
        User user =(User) request.getSession().getAttribute("user");
        if(user!=null){
            //登录成功,将session中的账号信息存放到log日志中
            logger.info(user.getName()+":"+user.getPassword());
            System.out.println("成功");
            return  true;
        }else {
            response.sendRedirect("/login.jsp");
            return false;
        }
    }
}

祝学习愉快!

  • 慕粉1555086949 提问者 #1

    我在Controller中设置了session,但是在拦截器中获取是null

    @Controller
    public class LoginController {
        @PostMapping("/login")
        public ModelAndView view(User user, HttpSession httpSession) {
            ModelAndView modelAndView = new ModelAndView();
            if (user.getUsername().equals("admin") && user.getPassword().equals("admin")) {
                modelAndView.setViewName("/main.jsp");
                httpSession.setAttribute("user", user);
            } else {
                modelAndView.setViewName("/login.jsp");
            }
            return modelAndView;
        }
    }

    拦截器

    public class LoginInterceptor implements HandlerInterceptor {
        Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            System.out.println("preHandle拦截已开启");
            User user = (User) request.getSession().getAttribute("user");
            if (user != null) {
                logger.info(user.getUsername() + "|" + user.getPassword());
                System.out.println("记录成功");
                return true;
            } else {
                System.out.println("信息错误");
                response.sendRedirect("/login.jsp");
                return false;
            }
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("after拦截以开启");
            StringBuffer info = new StringBuffer();
            info.append(request.getRemoteAddr());
            info.append("|");
            info.append(request.getRequestURL());
            info.append("|");
            info.append(request.getHeader("user-agent"));
            logger.info(info.toString());
        }
    }

    https://img1.sycdn.imooc.com//climg/62fddf8409f7816419380493.jpg

    2022-08-18 14:43:22
  • 好帮手慕小尤 回复 提问者 慕粉1555086949 #2

    同学你好,1、测试同学代码是可以获取到session中的数据的。运行效果图如下所示:

    https://img1.sycdn.imooc.com//climg/62fdf693096d619508550481.jpg

    2、

        1)猜测同学可能是没有成功登陆导致的,同学可以先登陆,然后在访问其他路径试一下,查看是否有被拦截并查看是否有获取到session值。

        2)也有可能是页面缓存导致的,建议同学清除浏览器与编译器缓存试一下。

    祝学习愉快!

    2022-08-18 16:23:04
  • 慕粉1555086949 提问者 回复 好帮手慕小尤 #3

    可以登录成功,我把拦截器配置注释掉之后,会跳转到main.jsp,也可以显示当前用户名。

    https://img1.sycdn.imooc.com//climg/62fdfbae09d15a4c05980164.jpg

    https://img1.sycdn.imooc.com//climg/62fdfbae09d3358110950429.jpg


    但是开启之后就不会跳转了,而且在拦截器方法中也没有数据
    拦截器配置

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/resources/**"/>
            <mvc:exclude-mapping path="/login.jsp"/>
            <bean class="pers.qy.spring.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>


    2022-08-18 16:43:50
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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