Struts2.0里的过滤器interceptor之用户只可以访问Login.action与Register.action,访问其它.action的链接时,自动切换到登录页面

刚开始,在学习过滤器时,我继承的过滤器是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来访问我们的系统。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值