3ur*_*och 10 login struts2 interceptor
我目前正在学习Struts 2,目前我正在构建一个简单的应用程序,其中未经验证的用户被重定向到登录表单.
我有一个登录表单和操作功能,它获取用户凭据,验证它们并在会话中存储User对象但是我现在试图阻止在登录之前访问页面并且我试图用拦截器执行此操作.
我的问题是我编写了一个拦截器,用于检查User对象是否已保存在会话中,但如果没有,我想重定向到登录页面,并且无法绕过struts并使用HttpServletResponse.sendRedirect方法
组态:
<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>
Run Code Online (Sandbox Code Playgroud)
拦截器代码:
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
leo*_*loy 18
标准方法是返回一个特殊的全局结果(例如" login ")并定义从该结果到您的结果的全局映射admin/login.jsp.所以你必须添加这一行:
if(user == null) {
return "login";
}
Run Code Online (Sandbox Code Playgroud)
在你的struts.xml:
<global-results>
<result name="login">/admin/login.jsp</result>
</global-results>
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我担心你用你的单个拦截器替换默认的Struts2拦截器堆栈,通常你想要将拦截器添加到堆栈中.例如:
<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"/>
Run Code Online (Sandbox Code Playgroud)
BTW2:当然,您不能将拦截器应用于您的登录操作.
| 归档时间: |
|
| 查看次数: |
20876 次 |
| 最近记录: |