January
Ограничение доступа или защита jsp-страниц
Posted in: Java Web Design, J2EE, Java technologies, J2SE |
В этой статье я приведу небольшой пример того, как защитить jsp-страницы вашего приложения от несанкционированного доступа.
Все, что вам нужно, - это создать небольшой Java-класс и наследовать jsp-страницы от него.
А вот и упрощенный пример такого класса (импорт пакетов опущен):
public abstract class SecureJSP extends HttpServlet
implements HttpJspPage {
public void destroy() {
jspDestroy();
}
public void init() throws ServletException {
jspInit();
}
public void jspDestroy() { }
public void jspInit() { }
public void service(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
HttpSession session = request.getSession(false);
boolean isPassed = false;
if (session != null) {
if (session.getAttribute(“authorized”) != null)
isPassed = true;
}
if (!isPassed) {
forward(getErrorPageName(), request, response);
return;
}
_jspService(request, response);
}
private void forward(String page, HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
protected String getErrorPageName() {
return “/denied.jsp”;
}
}
После прохождения авторизации, в текущую сессию кладется некоторый объект (в примере - authorized). При загрузке страницы проверяется наличие этого объекта в сессии. Если объект не был найден, пользователь перенаправляется на страницу с сообщением об отказе в доступе (denied.jsp). После выхода пользователя из системы, объект обязательно нужно убрать из сессии.
Для указания того, что некоторая jsp расширяет Java-class, нужно в хедере страницы написать следующий код:
<%@ page extends=“SecureJSP”%>
Естественно класс SecureJSP можно значительно улучшить, но общее представление о защите веб-приложений, думаю, вы получили.
4 Comments »
RSS feed for comments on this post. TrackBack URI
Мне кажется, для таких целей лучше использовать servlet filters.
Для этих целей лучше использовать фильтры, так как это даст возможность сконцентрировать управление доступом в одном месте, а не распылять по куче jsp файлов.
Хотя этот прикол можно использовать как частный случай для блокирования контента странички.
А еще можно использовать AOP. Плюсы этого подхода можно почитать здесь http://citforum.gatchina.net/internet/javascript/aop/
Используйте лучше фильтры
package promzilkonstrukciya;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class filter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String contextPath = req.getContextPath();
HttpSession session = req.getSession();
if((session!=null) && (session.getAttribute(”access”)!=null))
{
String param = session.getAttribute(”access”).toString();
if(param.equals(”granted”))
{
chain.doFilter(request, response);
}
}
else
{
if(req.getRequestURI().equals(contextPath+”delete.htm”) ||
req.getRequestURI().equals(contextPath+”upload”) ||
req.getRequestURI().equals(contextPath+”/adm.htm”) ||
req.getRequestURI().equals(contextPath+”/add.htm”) ||
req.getRequestURI().equals(contextPath+”/edit.htm”) ||
req.getRequestURI().equals(contextPath+”/xmlanswer”) ||
req.getRequestURI().equals(contextPath+”/load.htm”) ||
req.getRequestURI().equals(contextPath+”/scrpt.js”))
{
res.sendRedirect(contextPath + “/login.jsp”); //редирект на логин
}
else
{
chain.doFilter(request, response);
}
}
}
public void destroy() {
}
public void init(FilterConfig filterConfig) {
}
}
В первом else можно использовать как разрешенные страницы так и не разрешенные( для этого нада писать !req.getRequestURI().equals(contextPath+”delete.htm”)&&
и так далее