小疑问!!!!

来源:5-3 权限拦截过滤器的编写

MasonM

2019-06-01 18:07:54

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    //获得Session(需要HttpServletRequest)
    HttpServletRequest request=(HttpServletRequest)req;
    User existUser = (User)request.getSession().getAttribute("existUser");
    if (existUser == null) {
        //没有登录
        req.setAttribute("msg","你还没有登录,请先登录!");
        req.getRequestDispatcher("/login.jsp").forward(request,resp);
        return;
    }
        chain.doFilter(req, resp);


}

老师,为什么这里

使用ServletRequest对象req来设置属性req.setAttribute("msg","你还没有登录,请先登录!");

但转发的时候,forward里并不是用ServletRequest对象req呢?↓

req.getRequestDispatcher("/login.jsp").forward(request,resp);

而是用HttpServletRequest对象request呢?

写回答

6回答

吃吃吃鱼的猫

2019-06-02

同学你好,这是查看源码的提示,同学点击Accept试一下。

http://img.mukewang.com/climg/5cf3a27c0001c4d104910339.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

0

MasonM

提问者

2019-06-02

http://img.mukewang.com/climg/5cf3899c0001368907060483.jpg

请问一下老师,我在idea中按ctrl想查看源码,结果弹出这个,这个是什么意思呢?

应该选择哪一个?

0

吃吃吃鱼的猫

2019-06-02

同学你好,我根据经验来说,第一种是可以的哦~

使用了强转后的HttpServletRequest request对象来调用getRequestDispatcher()转发的话,jsp页面能获取到。

但是如果重新new了一个HttpServletRequest,是获取不到之前对象中的数据的。

http://img.mukewang.com/climg/5cf3813f0001ae9805000169.jpg

同学可以在自己环境中进行测试一下哦~这样也能加深印象呢~

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

0

MasonM

提问者

2019-06-02

http://img.mukewang.com/climg/5cf336af0001dde608970290.jpg

这里是使用了ServletRequest req对象来设置msg属性的,

然后也是用ServletRequest req对象来调用getRequestDispatcher()来转发的,

如果是这里是使用了强转后的HttpServletRequest request对象来调用getRequestDispatcher()转发的话,jsp页面还能获取到吗?

例如:

1:

//获得Session(需要HttpServletRequest)
    HttpServletRequest request=(HttpServletRequest)req;
    User existUser = (User)request.getSession().getAttribute("existUser");
    if (existUser == null) {
        //没有登录
        req.setAttribute("msg","你还没有登录,请先登录!");
        request.getRequestDispatcher("/login.jsp").forward(request,resp);
        return;
    }
        chain.doFilter(req, resp);

变成这样呢?


或者如果是这样呢?

//获得Session(需要HttpServletRequest)
    HttpServletRequest request=new HttpServletRequest() ;
    User existUser = (User)request.getSession().getAttribute("existUser");
    if (existUser == null) {
        //没有登录
        req.setAttribute("msg","你还没有登录,请先登录!");
        request.getRequestDispatcher("/login.jsp").forward(request,resp);
        return;
    }
        chain.doFilter(req, resp);

或者这样的话,jsp页面还能获得到设置的msg吗

0

吃吃吃鱼的猫

2019-06-02

同学你好,

HttpServletRequest继承自ServletRequest

HttpServletRequest只是比ServletRequest多了一些针对于Http协议的方法。如getHeader (String name), getMethod () ,getSession () 等等。

转发方法在两者中都存在,所以,都可以使用哦~

同学第二个问题,数据存放在JSP内置对象request中,使用HttpServletRequest,ServletRequest都可以获得对象中的数据,和强转没有关系哦~

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

0
hasonM
h 老师我想问个问题,请看新的回答
h019-06-02
共1条回复

好帮手慕阿满

2019-06-01

同学你好,这里在转发时使用ServletRequest和HTTPServletRequest都可以。至于使用ServletResponse,因为在这个doFilter中没有使用的HttpServletResponse,也没有转换,所以还是使用的ServletResponse。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

0
hasonM
h 为什么这里转发时使用ServletRequest和HTTPServletRequest都可以呢? 是不是因为这里的HTTPServletRequest对象是由ServletRequest对象强转过来的,所以都可以? 另外我想知道,因为是用ServletRequest对象来设置属性的↓ req.setAttribute("msg","你还没有登录,请先登录!"); 然后我们转发是,是把HTTPServletRequest对象传递过去,也同样能获取到msg属性,原因是不是也是因为这里的HTTPServletRequest对象是由ServletRequest对象强转过来呢?
h019-06-01
共1条回复

0 学习 · 8016 问题

查看课程

相似问题