我正在检查用户的登录状态(权限),如果他没有访问特定.jsp页面的正确权限,我想将其重定向到另一个页面。
使用是否安全
<c:redirect>
来自JSTL的?用户是重定向是100%还是他可能会收到我的jsp页面的html输出?
在php中,为了确定,我会放置一个exit();在HEADER重定向之后。但是,由于我正在使用带有asp和servlet的MVC,我不想将Java放在我的.jsp页面中。
答案 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,用户将无法看到任何输出。