刚开始,在学习过滤器时,我继承的过滤器是Filter这个接口。
后来经别人指点,这个接口是最老的了,Struts2有自己封装好的接口,即interceptor。
一般在使用拦截器时不是实现Interceptor接口,而是直接继承AbstractInterceptor,AbstractInterceptor也是实现Interceptor接口,
它只是使用intercept()方法,而没有实现init()、destroy()方法。
LoginInterceptor.java的实现代码如下:
package com.struts.filter;
import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.struts.action.LoginAction;
import com.struts.action.RegisterAction;
public class LoginInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
//只允许登录与注册页面且.action的能通过地址栏直接访问
if (LoginAction.class == invocation.getAction().getClass()
|| RegisterAction.class == invocation.getAction().getClass()) {
return invocation.invoke();
}
//获取Session对象
Map map = invocation.getInvocationContext().getSession();
//获取Login.action类中存在Session中属性值
String username = (String) map.get("username");
//如果Session中为空,则跳转到登录页面
if (null == username) {
return "login";
}
return invocation.invoke();
}
}
Struts.xml里面对应的配置项
class="com.struts.filter.LoginInterceptor"对应上段Java代码所在的包路径。
<result name="login" type="redirect">/Login.action</result>中的name="login"与上段Java代码中的return "login"相对应。
即是要跳转的路径。
<interceptors>
<interceptor name="loginInterceptor" class="com.struts.filter.LoginInterceptor">
</interceptor>
<interceptor-stack name="myDefaultInterceptorStack">
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultInterceptorStack"></default-interceptor-ref>
<global-results>
<result name="login" type="redirect">/Login.action</result>
</global-results>
<default-interceptor-ref name="myDefaultInterceptorStack"></default-interceptor-ref>是设置所有Action自动调用的拦截器堆栈,名字与前面的对应起来就行。
Login.java代码如下:
package com.struts.action;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import org.apache.catalina.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.struts.bean.UserBean;
import com.struts.dao.ConnectDB;
import com.struts.dao.UserInfoDAO;
public class LoginAction extends ActionSupport {
private String username="";
private String password="";
List<UserBean> userList;
public static Connection conn = null;
public static PreparedStatement pstmt = null;
public static PreparedStatement pstmt1 = null;
public static ResultSet rs = null;
public List<UserBean> getUserList() {
return userList;
}
public void setUserList(List<UserBean> userList) {
this.userList = userList;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
UserInfoDAO userInfo = new UserInfoDAO();
List<UserBean> userList = userInfo.queryUserInfo();
this.userList = userList;
if(username.equalsIgnoreCase("") || password.equalsIgnoreCase("")){
return "login";
}
conn = ConnectDB.getConn();
String strSql = "select username from userlist";
pstmt = conn.prepareStatement(strSql);
rs = pstmt.executeQuery();
while (rs.next()) {
if (username.equalsIgnoreCase(rs.getString("username")) && password.equalsIgnoreCase("user")) {
return "userInfo";
}
}
ActionContext.getContext().getSession().put("username", username);
return "error";
}
}
ActionContext.getContext().getSession().put("username", username);把username属性放入到Session中去。
如果把JSP页面放在工程的WebContent文件目录下,在浏览器中输入某某.jsp页面还是能直接访问的。
为了防止这样的情况发生,我们需要把JSP页面放在工程的WEB-INF目录下。
这样,用户就不能直接访问某些页面了。只能通过.action来访问我们的系统。