- 自定义登录拦截器
1.需求:在项目中,有很多的action的超链接,实现只有是登录的状态,才可以点击action的超链接实现功能,如果不是登录状态,点击action超链接返回登录界面
2.登录状态:使用session域对象实现
(1)登陆成功把数据放到session里面
(2)判断session是否有值,可以知道是否是登录状态
- 简单登录保存session用户对象
package com.sq.date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.sq.entity.User;
/**
*@author sq
*使用表达式封装对象
*/
public class DateDemo3Action extends ActionSupport{
//1.声明实体类
private User user;
//2.生成set,get方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.setAttribute("user", user);
return NONE;
}
}
- 拦截器实现过程
步骤
1.创建类,继承MethodFilterInterceptor
2.重新MethodFilterInterceptor类里面的方法写拦截器逻辑
package com.sq.interceptor;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
/**
*@author sq
*
*/
public class LoginIntercepetor extends MethodFilterInterceptor{
//写拦截逻辑
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//得到session
HttpServletRequest request = ServletActionContext.getRequest();
Object object = request.getSession().getAttribute("user");
if(null != object){
//登陆状态
//做类似放行操作,执行action
return invocation.invoke();
}else{
//不是登录状态
//不执行action,返回登录界面
//到result标签里面找到名称为login的值,到配置路径
return "login";
}
}
}
3.配置action和拦截器关系(注册拦截器)
(1)在要拦截的action标签所在的package标签声明拦截器
<interceptors>
<interceptor name="loginintercept" class="com.sq.interceptor.LoginIntercepetor"></interceptor>
</interceptors>
(2)在具体的action标签里面使用声明的拦截器
<interceptor-ref name="loginintercept"></interceptor-ref>
解决:把默认拦截器手动使用一次
<interceptor-ref name="defaultStack"></interceptor-ref>
4.配置拦截器,对action里面所有的方法进行拦截
(1)在action里面还有login的方法,会被拦截进入登录界面,永远登录不进去
(2)解决:直接通过配置让某些方法不进行拦截
<interceptor-ref name="loginintercept">
<!-- 配置某些方法不进行拦截
name属性:excludeMethods
值:action不拦截的方法名称
-->
<param name="excludeMethods">add</param>
</interceptor-ref>
5.小问题
不是登录会出现页面嵌套
(1)设置打开页面位置 target="_parent"