2015-04-10 5 views
2

Моих классов действий часто имеет переменную action поля, которое было присвоено значением внутри метода execute():Пользователя должен пройти через действие первого перед визуализацией JSP

public class MyAction extends ActionSupport { 
    private static final long serialVersionUID = 1L; 

    private String action; 

    @Override 
    public String execute() throws Exception {  
     action = "true"; 

     // code here 

     return SUCCESS; 
    } 

    public String getAction() { 
     return action; 
    } 

    public void setAction(String action) { 
     this.action = action; 
    } 
} 

В JSP, я проверить, является ли action переменными (который теперь передается как запрос) null. Если null, он будет перенаправлять к классу действий, иначе, он будет продолжать оказывать страницу:

<head> 
    <c:if test="${action == null}"> 
     <c:redirect url="myaction" /> 
    </c:if> 
</head> 

я делаю это, чтобы гарантировать, что пользователь проходит через действие первый в случае, если они пытаются незаконно прыгайте JSP.

Он работает по назначению, но есть ли другой элегантный способ сделать это?

+1

Вы делаете это неправильный путь. Просто поставьте jsp-s под WEB-INF. –

+0

Не будет ли это статус статуса 404? Что, если я хочу, чтобы он тоже перенаправлялся? – silver

+1

Страницы должны быть доступны только из действий. Перенаправление не является проблемой. –

ответ

1

Получите имя из контекста действия. Он имеет отображение действия для текущего действия, которое включает имя действия. Также вы должны знать, что теги Struts не будут работать без контекста действий, но только если JSP используется с фильтром сопоставления.

<c:set var="actionName"><s:property value="%{#context['struts.actionMapping'].name}"/></c:set> 
action name: ${actionName}<br/> 
<c:if test="${empty actionName}"> 
    <c:redirect url="myaction" /> 
</c:if> 

EDIT:

Пример фильтра для предотвращения прямого доступа к страницам Jsp

public class SimpleFilter implements Filter{ 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) servletRequest; 
    HttpServletResponse response = (HttpServletResponse) servletResponse; 

    if (request.getRequestURI().endsWith(".jsp")) { 
     DispatcherType dt = request.getDispatcherType(); 
     if (dt == DispatcherType.FORWARD || dt == DispatcherType.INCLUDE) 
     //handle dispatcher results 
     filterChain.doFilter(request, response); 
     else 
     response.sendError(404, "Direct access to JSP"); 
    } else { 
     //let's struts handle the request 
     filterChain.doFilter(request, response); 

    } 

    } 

    @Override 
    public void destroy() { 

    } 
} 
+0

Привет, RomanC, я могу вызвать перехватчики перед действием. Есть ли что-то подобное для JSP? Что-то я могу вызвать перед тем, как сделать JSP, чтобы убедиться, что он прошел через действие первым? – silver

+0

Вы можете позвонить в фильтр. –

+0

Можете ли вы опубликовать пример для этого? – silver

Смежные вопросы