本文简单记录ssh项目中拦截器的应用:只有登录的用户才可以访问后台链接。未登录用户直接访问其他后台链接将被拦截到登录页面进行登录。就像逛某宝网站,未登录可以浏览商品,但是购买下单,或者收藏订阅,都会提示先登录才能进行那些操作。
项目源代码可以到我的资源下载 —ssh项目(练习)
第一步:编写一个普通类实现interceptor接口,并实现接口的所有方法
public class LoginInterceptor implements Interceptor{
@Override
public void destroy() {
//拦截器销毁方法
}
@Override
public void init() {
//拦截器初始化方法
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//具体对拦截到的方法进行的操作在此方法写
}
}
第二步:在struts的核心配置文件struts.xml中配置拦截器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- struts2的核心配置文件自动重修加载 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<package name="sys" namespace="/" extends="struts-default">
<!-- 主要这一块================【start】============================== -->
<interceptors>
<!-- 声明自定义拦截器 -->
<interceptor name="loginInterceptor" class="org.kuwei.interceptor.LoginInterceptor">
<!-- 声明不需要(或需要)拦截的方法 个人认为声明不需要拦截的比较方便 多个方法名以逗号分隔即可 -->
<param name="notIncludeMethods">ckLogin</param>
</interceptor>
<!-- 声明自定义拦截器栈 -->
<interceptor-stack name="loginStack">
<interceptor-ref name="defaultStack"></interceptor-ref> <!-- 必须引用struts默认的拦截器栈 -->
<interceptor-ref name="loginInterceptor"></interceptor-ref> <!-- 引用自定义的拦截器 -->
</interceptor-stack>
</interceptors>
<!-- 主要这一块=================【end】============================= -->
<action name="nurse-*" class="org.kuwei.action.NurseAction" method="{1}">
<!--
访问此action中的方法都会被拦截判断,根据需要进行其他操作
-->
<interceptor-ref name="loginStack"></interceptor-ref> <!-- 引用自定义的拦截器 -->
<result name="list">/WEB-INF/view/emp_list.jsp</result>
<result name="add">/WEB-INF/view/emp_add.jsp</result>
<result name="update">/WEB-INF/view/emp_update.jsp</result>
<result name="login">/index.jsp</result>
<result name="success" type="redirectAction">nurse-list</result>
</action>
</package>
</struts>
第三步:编写自定义拦截器中具体要执行的操作
package org.kuwei.interceptor;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.kuwei.dto.Nurse;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
* 功能:登录拦截器
* @kuwei 2017年5月2日下午7:39:30
*/
@SuppressWarnings("serial")
public class LoginInterceptor implements Interceptor{
//此变量是struts.xml中定义的不需要拦截的方法以逗号拼接的字符串
//提供get 和 set方法之后可以自动取到struts.xml文件中定义的值
private String notIncludeMethods;
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 获取触发拦截器的方法(也就是当前地址栏访问的方法的方法名)
String method = invocation.getProxy().getMethod();
//将不需要拦截的方法字符串拆分成数组
String[] no = notIncludeMethods.split(",");
/*
定义一个集合,存放数组中的值。因为要用list的contains方法
判断此字符串是否包含在list集合中
数组并没有这样方便的方法,所以新建集合存放数组的值
*/
List<String> list = new ArrayList<String>();
for (int i = 0; i < no.length; i++) {
list.add(no[i]);
}
HttpSession session = ServletActionContext.getRequest().getSession();
Nurse nurse = (Nurse) session.getAttribute("nurse");
if(list.contains(method)){ //方法包含在notIncludeMethods中不需要拦截
return invocation.invoke(); //放行
}else{ //可能需要拦截
if(nurse!=null){ //已登录,不需要拦截
return invocation.invoke(); //放行
}else{
session.setAttribute("err_msg", "非法访问!请先登录");
return "login"; //未登录,需要拦截 去登录页面
}
}
}
//getters and setters
public String getNotIncludeMethods() {
return notIncludeMethods;
}
public void setNotIncludeMethods(String notIncludeMethods) {
this.notIncludeMethods = notIncludeMethods;
}
}
学习的过程也是不断忘记的过程,随手记录。