2010-06-08 25 views
10

Tôi hiện đang trong quá trình học Struts 2 và hiện tôi đang xây dựng một ứng dụng đơn giản, nơi người dùng chưa được xác minh được chuyển hướng đến biểu mẫu đăng nhập.Chuyển hướng đến một hành động khác trong thiết bị chặn trong thanh chống 2

Tôi có biểu mẫu đăng nhập và chức năng hành động lấy thông tin người dùng, xác minh và lưu trữ đối tượng Người dùng trong phiên, tuy nhiên tôi hiện đang cố gắng ngăn truy cập vào các trang trước khi đăng nhập diễn ra và tôi đang cố gắng thực hiện điều này với một kẻ đánh chặn. Vấn đề của tôi là tôi đã viết một máy đánh chặn kiểm tra xem đối tượng người dùng đã được lưu trong phiên hay chưa nhưng nếu nó không muốn chuyển hướng đến trang đăng nhập và không thể tìm thấy cách nào để thực hiện điều này mà không bỏ qua thanh chống và sử dụng phương pháp HttpServletResponse.sendRedirect

Cấu hình:

<package name="mypackage" extends="struts-default" namespace="/admin"> 

    <interceptors> 
     <interceptor name="login" class="my.LoginInterceptor" /> 
    </interceptors> 

    <default-interceptor-ref name="login"/> 

    <action name="login" class="my.LoginAction"> 
     <result name="input">/admin/login.jsp</result> 
     <result name="success" type="redirect">/admin</result> 
    </action> 

    <action name="private" class="my.PrivateAction"> 
     <result>/admin/private.jsp</result> 
    </action> 

</package> 

mã đánh chặn:

@Override 
public String intercept(ActionInvocation inv) throws Exception { 

    Map<String, Object> session = inv.getInvocationContext().getSession(); 

    Object user = session.get("user"); 
    if(user == null) { 

         // redirect to the 'login' action here    

    } 
    else { 
     return inv.invoke(); 
    } 

} 

Trả lời

18

T cách tiêu chuẩn của anh ấy là trả lại kết quả toàn cầu đặc biệt (ví dụ: "đăng nhập") và xác định ánh xạ toàn cục từ kết quả đó cho số admin/login.jsp của bạn. Vì vậy, bạn chỉ phải thêm dòng này:

if(user == null) { 
     return "login"; 
} 

Và trong bạn struts.xml:

<global-results> 
    <result name="login">/admin/login.jsp</result> 
</global-results> 

BTW, tôi sợ rằng bạn đang thay thế mặc định struts2 chặn ngăn xếp với đánh chặn duy nhất của bạn, thông thường bạn muốn để thêm trình chặn của bạn vào ngăn xếp. Ví dụ:

<interceptors> 
<interceptor name="login" class="my.LoginInterceptor" /> 

<interceptor-stack name="stack-with-login"> 
    <interceptor-ref name="login"/> 
    <interceptor-ref name="defaultStack"/> 
</interceptor-stack> 
</interceptors> 
<default-interceptor-ref name="stack-with-login"/> 

BTW2: Bạn KHÔNG được áp dụng kẻ chặn cho hành động đăng nhập của bạn, tất nhiên.

+0

Cảm ơn bạn, và nhờ thêm cho sự chỉ đạo tiền thưởng. Làm thế nào tôi sẽ đi về ngăn chặn các interceptor từ bắt các hành động đăng nhập? – 3urdoch

+2

Trên thực tế, tôi đã làm việc đó cho bản thân mình, tôi chỉ cần đặt vào hành động đăng nhập. – 3urdoch

+0

Vâng, đó là một cách. – leonbloy

0

Nếu bạn cần phải sử dụng gửi chuyển hướng, trả về null để tránh vấn đề này (ví dụ chuyển hướng từ www.domain.com để domain.com):

public String intercept(final ActionInvocation invocation) throws Exception { 

    String url=RequestUtil.getURLWithParams(); //you should implement this 
    int index=url.indexOf("www"); 
    if (index!=-1 && index<10) { 
     //Note: <10 to check that the www is in the domain main url 
     //https://localhost:8443/mycontext/myaction.action?oneparam=http://www.youtube.com/user/someuser 
     String redirection=url.replaceFirst("www\\.", ""); 
     LOG.debug("Redirection from "+url+" to "+redirection); 
     RequestUtil.getResponse().setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
     RequestUtil.getResponse().sendRedirect(redirection); 
     return null; 
    } 
    return invocation.invoke(); 
} 
Các vấn đề liên quan