您的位置:首页 > 编程语言 > Java开发

【Struts】【登入拦截器】

2018-01-05 10:04 309 查看
拦截器,会对所有的action进行拦截,然后根据业务逻辑,对一些action放行.


登入拦截器,不需要拦截的action:

请求到登入界面的action : 逻辑视图 请求转发 login.jsp;

处理登入信息的action: 逻辑视图 重定向 到主界面的action(重点)

拦截器类

实现接口AbstractInterceptor,并覆盖方法

通过全局字段的setter方法,可以将拦截器在xml文件声明的参数(字符串),传递到拦截器类中.

通过invocation.getProxy().getActionName();获取当前的action名.

invocation.invoke();表示放行

public class LoginInterceptor extends AbstractInterceptor{

//获取配置文件的参数,将其变成List
private  List<String> excludeParams;
public void setExcludeParams(String str) {
this.excludeParams=Arrays.asList(str.split(","));
}

//覆盖方法
public String intercept(ActionInvocation invocation) throws Exception {
//获取访问的action名
String name = invocation.getProxy().getActionName();
System.out.println("当前访问"+name);
//从session中获取user对象
User user = (User)ActionContext.getContext().getSession().get("USER_IN_SESSION");
//放行条件:1.user不空,2.当前action名被声明不需要拦
if(excludeParams.contains(name)||user!=null) {invocation.invoke();}
return "login";
}
}


拦截器的配置文件

interceptor.xml

<struts>
<package name="interceptorPKG" namespace="/" extends="struts-default">
<interceptors>
<!-- 注册自定义拦截器 -->
<interceptor name="LoginInterceptor" class="action.LoginInterceptor">
<param name="excludeParams">Login_login,login</param>
</interceptor>
<!-- 生成拦截器stack -->
<interceptor-stack name="myInterceptor">
<interceptor-ref name="LoginInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>

</package>


struts.xml

<struts>
<!--映入拦截器配置文件-->
<include file="/interceptor.xml"/>

<!--继承拦截器的包-->
<package name="default" namespace="/" extends="interceptorPKG">
<!--使用拦截器stack-->
<default-interceptor-ref name="myInterceptor"/>

<global-results>
<result name="login">login.jsp</result>
<result name="main" type="redirectAction">Employee</result>
</global-results>
</package>

<!--action配置-->
<action name="Employee_*" class="action.EmployeeAction" method="{1}">
<result>/WEB-INF/view/main.jsp</result>
</action>

<action name="Login_*" class="action.LoginAction" method="{1}">
</action>
</struts>


登入的Action类

action名:Login_login

作用:封装请求信息到session

方法名:login

逻辑视图:main >>>重定向到另外一个action

action名:Login 或 Login_execute

作用:请求转发到登入界面

方法名: execute

逻辑视图:”login” >>&
4000
gt;请求转发到login.jsp

以上两个action ,不需要拦截

<interceptor name="LoginInterceptor" class="action.LoginInterceptor">
<param name="excludeParams">Login_login,login</param>
</interceptor>


public class LoginAction extends ActionSupport {

private static final long serialVersionUID = 1L;
private User user=new User();
public User getUser() {
return user;
}

//处理登入信息存入session
public String login() throws Exception {
if(StringUtils.hasLength(user.getUsername())) {
ActionContext ctx = ActionContext.getContext();
ctx.getSession().put("USER_IN_SESSION", user);
return "main";
}
return "login" ;
}

//进入登入界面
public String execute() throws Exception {
return "login" ;
}

}


jsp

<%session.invalidate(); %>
<s:debug/>
<s:form action="/Login_login">
帐号<s:textfield name="user.username"/><br>
密码<s:password name="user.password" /><br>
<s:submit value="do it"/>
</s:form>


登入效验

参考
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2