这一篇,主要介绍自定义拦截器,
通过自定义的模拟登录验证拦截器来介绍:
只有当用户登录了,才能发送请求。不登录不能请求。
首先定义一个User实体。属性:userName password
定义service层的UserService
public boolean login(User user) {
if("12".equals(user.getUserName()) && "1234".equals(user.getPassword())){
return true;
}else {
return false;
}
}
再定义UserAction:
public class UserAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private User user = new User();
private UserService userService = new UserService();
private String error;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
@Override
public String execute() throws Exception {
if(userService.login(user)) {
ActionContext actionContext = ActionContext.getContext();
Map<String, Object> session = actionContext.getSession();
session.put("currentUser", user);
return SUCCESS;
}else {
this.error="用户名或密码错误!";
return ERROR;
}
}
}
验证通过,将正确的用户存在session中。返回success,这里注意获取session的方法。
不通过,返回error.
定义拦截器:LoginInterceptor拦截器:
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("执行Action前");
Map<String, Object> session = ActionContext.getContext().getSession();
Object currentUser = session.get("currentUser");
String result = null;
if(currentUser!=null) {
result = invocation.invoke();
}else {
HttpServletRequest request=(HttpServletRequest)invocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);
request.setAttribute("error", "请先登录!");
result="error";
}
System.out.println("result:"+result);
System.out.println("执行Action后");
return result;
}
在执行UserAction前,先进行一下判断,看看session中是否currentUser.有说明已经登录了,没有说明未登录。
已经登录了,继续执行invocation.invoke();
扫描二维码关注公众号,回复:
2754273 查看本文章
未登录,定义一个error信息,保存到request中,这里注意获取request的方法。
再struts.xml中:
<struts>
<package name="user" extends="struts-default" >
<interceptors>
<interceptor name="loginInterceptor" class="com.java.interceptor.LoginInterceptor"></interceptor>
</interceptors>
<action name="user" class="com.java.action.UserAction">
<result name="success">/success.jsp</result>
<result name="error">/login.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<action name="hello" class="com.java.action.HelloAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
当请求不是验证登录时,要拦截。
请求界面:
<form action="user" method="post">
用户名:<input type="text" name="user.userName"/>
密码:<input type="password" name="user.password"/><br/>
<input type="submit" value="登录"/><font color="red">${error }</font>
</form>
现在想,如果很多请求时呢?要每一个请求后面都加两个拦截器吗?
定义一个拦截器栈,并把该栈设为默认的拦截器栈即可。
<interceptors>
<interceptor name="loginInterceptor" class="com.java.interceptor.LoginInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
此时两个action:
<action name="user" class="com.java.action.UserAction">
<result name="success">/success.jsp</result>
<result name="error">/login.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<action name="hello" class="com.java.action.HelloAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
因为登录不需要拦截,所以要写拦截器栈。表示不用默认的拦截器栈
测试:
请求login.jsp时:
当输入密码错误时:
当未登录,请求hello时:
登录成功时:
在请求hello: