使用c:redirect重定向用户浏览器是否安全?

时间:2012-02-02 22:17:51

标签: java servlets jstl

我正在检查用户的登录状态(权限),如果他没有访问特定.jsp页面的正确权限,我想将其重定向到另一个页面。

使用是否安全

<c:redirect> 
来自JSTL的

?用户是重定向是100%还是他可能会收到我的jsp页面的html输出?

在php中,为了确定,我会放置一个exit();在HEADER重定向之后。但是,由于我正在使用带有asp和servlet的MVC,我不想将Java放在我的.jsp页面中。

3 个答案:

答案 0 :(得分:1)

如果您正在使用MVC,则不应使用JSTL在JSP中完成重定向。并不是说它不起作用,但是发布重定向只是视图的责任。这是控制器的责任。

如果响应的某些部分已被刷新,则从JSP重定向可能会失败。

使用response.sendRedirect()在控制器servlet中创建它。

答案 1 :(得分:1)

  

我正在检查用户的登录状态(权限),如果他没有访问特定.jsp页面的正确权限,我想将其重定向到另一个页面。 < / p>

规范方法是为此使用servlet Filter。您需要将这些受限制的页面分组为常见的URL模式,例如/app/*/secured/*/private/*或其他任何内容,然后将Filter映射到确切的网址格式上,该格式在doFilter()方法中大致执行以下操作(假设您“以通常的方式将登录用户存储在会话中。”

@WebFilter("/app/*")
public class AuthenticationFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (req.getSession().getAttribute("user") != null) {
            // User is logged in, so just continue request.
            chain.doFilter(request, response);
        } else {
            // User is not logged in, so redirect to some index/login page.
            res.sendRedirect(req.getContextPath() + "/login.jsp");
        }
    }

    // ...    
}

这可以使JSP免于复制混乱和变通方法,以防止在重定向之前提交响应。

答案 2 :(得分:0)

如果进行重定向,用户可以在打印时看到HTML输出。更好的方法可能是使用forward,用户将无法看到任何输出。