ssh中自定义监听器,拦截器,过滤器

发布时间:2018-06-30 11:32:01

SSH中自定义监听器、拦截器、过滤器

1、自定义监听器

a)自定义监听器有哪些

监听器的定义是在web.xml中完成,其实做过ssh项目的人并不陌生监听器,主要是因为spring提供了监听器就是

<listener>

<listener-class>

org.springframework.web.context.ContextLoa derListener

listener-class>

listener>

如果我们想自己定义一个监听器来完成我们自己的特定功能怎么办呢,struts为我们提供了自定义servlet监听器,他们主要有

(1)ServletContextListener

Servlet的上下文监听,它主要实现监听ServletContext的创建和删除。该接口提供了两种方法

                  1.contextInitialized(ServletContextEvent event);   通知正在收听的对象,应用程序 已经被加载和初始化。

                  2.contextDestroyed(ServletCotextEvent event);   通知 正在收听的对象,应用程序 已经被载出,即关闭。

(2)ServletAttributeListener

主要实现监听ServletContext属性的增加,删除和修 改。该接口提供了一下3个方法

          1.attributeAdded(ServletContextAttributeEvent event);    当有对象加入 Application的范围时,通知正在收听的对象

        2.attributeReplaced(ServletContextAttributeEvent event); 当在application的范围 对象取代另一个对象的时,通知正在收听的对象

         3.attributeRemoved(ServletContextAttributeEvent event);   当有对象从 application 的范围移除时,通知正在收听的对象

(3)HttpSessionListener

            HTTP会话监听,该接口实现监听HTTP会话创建、销 毁。该接口提供了一下两种 方法

                   1.sessionCreated(HttpSessionEvent event);        通知正在收听的对象,session 已经被加载及初始化

                   2. sessionDestoryed(HttpSessionEvent event)l          通知正在收听的对象, session已经被载出(HttpSessionEvent类的主要方法是getSession(),可以使用该方法回传 一个session对象)

(4)HttpSessionActivationListener

该接口实现监听HTTP会话activepassivate 该接口提供了一下3个方法 

                   1.attributeAddedHttpSessionBindingEvent event;         当有对象加入session 的范围时,通知正在收听的对象

                   2.attributeReplacedHttpSessionBindingEvent event;       当在session的范围 有对象取代另一个对象时,通知正在收听的对象。

                   3.attributeRemoved(HttpSessionBindingEvent event);            当有对象从s ession的范围有对象取代另一个对象时,通知正在收听的对象 其中 HttpSessionBindingEvent类主要有三个方法:getName()getSession()getValue()

(5)HttpBindingListener

接口实现监听HTTP会话中对象的绑定信息。 它是唯一不需要在web.xml中设定Listener的。该接口提供了以下2个方法

                  1.valueBound(HttpSessionBindingEvent event);                       当有对象加入 session的范围时会被自动调用

                  2.valueUnBound(HttpSessionBindingEvent event);                      当有对象从 session的范围内移除时会被自动调用

(6)HttpSessionAttributeListener

该接口实现监听HTTP会话中属性的设置请 求。该接口提供了以下两个方法。

                 1.sessionDidActivateHttpSessionEvent event);            通知正在收听的对象, 它的session已经变为有效状态。

                 2.sessionWillPassivate(HttpSessionEvent event);            通知正在收听的对象, 它的session已经变为无效状态

(7)ServletRequestListener

该接口提供了以下两个方法。

                   1.requestInitalized(ServletRequestEvent event)              通知正在收听的对象, ServletRequest已经被加载及初始化

                   2.requestDestroyed(ServletRequestEvent event)           通知正在收听的对象, ServletRequest已经被载出,即关闭
8ServletRequestAttributeListener 

该接口提供了一下三种方法

                    1.attributeAddedServletRequestAttributeEvent event);        当有对象加入 request的范围时,通知正在收听的对象

                    2.attributeReplaced(ServletRequestAttributeEvent event);         当在request 范围内有对象取代两一个对象时,通知正在收听的对象

                   3.attributeRemovedServletRequestAttributeEvent event;      当有对象从 request的范围移除时,通知正在收听的对象

b)怎么去自定义监听器

1)web.xml中加入这一样一段话

<listener>

<listener-class>com.wlm.iagtc.listener.SessionListenerlisten er- class>

listener>

把自己定义的监听器类的全路径写进去

SessionListener.java

package com.wlm.iagtc.listener;

import java.util.Enumeration;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

public class SessionListener implements HttpSessionListener{

public void sessionCreated(HttpSessionEvent se) {

System.out.println("session监听器启动!!!");

HttpSession session = se.getSession();

Enumeration login = session.getAttributeNames();

if(login.hasMoreElements()){

System.out.println("监听到了session对象的创建"+login.nextElement());

}

System.out.println(session.getId()+"----id");

}

public void sessionDestroyed(HttpSessionEvent se) {

System.out.println("session监听器销毁!!!");

HttpSession session = se.getSession();

Enumeration login = session.getAttributeNames();

if(login.hasMoreElements()){

System.out.println("监听到session对象的消失!"+login.nextElement());

}

}

}

就这样就可以监听session对象的创建和销毁了

注:session的创建:对象在你打开浏览器访问网站的一瞬间就框架就已经创建了

Session的销毁:session的销毁有三种方式

1、关闭浏览器

2、利用代码invalidate()方法销毁session对象

3、设置session过期时间,销毁session

<session-config>

<session-timeout>5session-timeout>

session-config>

你可以根据不同的接口,来监听不同的事件。

2、自定义过滤器

a)过滤器的创建

过滤器struts2自己就定义的有,是默认的过滤器在web.xml

<filter>

<filter-name>struts2filter-name>

<filter-class>

org.apache.struts2.dispatcher.ng.filter.StrutsPrepa reAndExecuteFilter
filter-class>

filter>

<filter-mapping>

<filter-name>struts2filter-name>

<url-pattern>/*url-pattern>

filter-mapping>

过滤器是Servlet2.3以上新增加的一个功能,其技术也是非常强大的。通过Filter技术可以对WEB服务器的文件进行拦截,从而实现一些特殊的功能。在JSP开发应用中也是必备的技能之一。Filter可以改变一个request(请求)和修改一个response(响应)Filter不是一个Servlet,它不能产生一个response,它能够在一个requsst到达Servlet之前预处理request,也可以在离开Servlet时处理response。当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源关联,如果有的话容器把请求交给过滤器处理,在过滤器中,可以改变请求的内容,或者重新设置请求的信息,然后再将请求发送给目标资源,当目标资源对请求做出响应后,容器同样将响应先转发给过滤器,过滤器可以对响应的内容进行转换,然后再将响应发送到客户端

b)怎么去自定义过滤器

SessionFilter

com.wlm.iagtc.filter.SessionFilter

logonStrings

/register.jsp;/login.jsp

includeStrings

.do;.jsp

redirectPath

/system/error.do

disabletestfilter

N

SessionFilter

/*

SessionFilter2

com.wlm.iagtc.filter.SessionFilter2

login

/login.jsp

SessionFilter2

/*

对应的java文件为

SessionFilter.java文件

package com.wlm.iagtc.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

public class SessionFilter implements Filter{

public FilterConfig filterChain;

public void destroy() {

this.filterChain = null;

}

public static boolean isContains(String container, String[] regx) {

for (int i = 0; i < regx.length; i++) {

if (container.indexOf(regx[i]) != -1) {

return true;

}

}

return false;

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

HttpServletRequest hrequest = (HttpServletRequest)request;

HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);

//

String logonStrings = filterChain.getInitParameter("logonStrings");

//

String includeStrings = filterChain.getInitParameter("includeStrings");

//

String redirectPath = /*hrequest.getContextPath() + */filterChain.getInitParameter("redirectPath");

//

String disabletestfilter = filterChain.getInitParameter("disabletestfilter");

//

if (disabletestfilter.toUpperCase().equals("Y")) {

chain.doFilter(request, response);

return;

}

String[] logonList = logonStrings.split(";");

String[] includeList = includeStrings.split(";");

//

if (this.isContains(hrequest.getRequestURI(), logonList)) {

chain.doFilter(request, response);

System.out.println("过滤不需要进行过滤的页面");

return;

}

//

if (!this.isContains(hrequest.getRequestURI(), includeList)) {

chain.doFilter(request, response);

System.out.println("过滤指定后缀");

return;

}

//

String user = ( String ) hrequest.getSession().getAttribute("loginUser");

if (user == null) {

// action

//wrapper.sendRedirect(redirectPath);

//jsp html

System.out.println(redirectPath+"过滤 用户判断");

request.getRequestDispatcher(redirectPath).forward(request, response);

return;

}else {

chain.doFilter(request, response);

return;

}

}

/**

* 初始化

*/

public void init(FilterConfig filterConfig) throws ServletException {

filterChain = filterConfig;

}

}

SessionFilter2.java文件

package com.wlm.iagtc.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

public class SessionFilter2 implements Filter{

public FilterConfig filterChain;

public void destroy() {

this.filterChain = null;

}

public static boolean isContains(String container, String[] regx) {

for (int i = 0; i < regx.length; i++) {

if (container.indexOf(regx[i]) != -1) {

return true;

}

}

return false;

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

HttpServletRequest hrequest = (HttpServletRequest)request;

HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);

//

String login = filterChain.getInitParameter("login");

String[] loginList = login.split(";");

System.out.println(hrequest.getRequestURI()+"----");

if (!this.isContains(hrequest.getRequestURI(), loginList)) {

chain.doFilter(request, response);

System.out.println("第二个过滤器过滤了。");

return;

} else{

chain.doFilter(request, response);

return;

}

}

/**

* 初始化

*/

public void init(FilterConfig filterConfig) throws ServletException {

filterChain = filterConfig;

}

}

3、自定义拦截器

a) 自定义拦截器

struts2中拦截器是用来拦截Action的,在执行Action之前拦截器会起一定的作用,执行一些预先处理的代码, 接着去执行Action中相关的方法,之后,又会回到拦截器里面,接着去执行后续的一些操作

拦截器可以有多个,组成拦截器栈

拦截器是顺序执行的

拦截器如果拦截下了一个页面,那么下面的拦截器就不会去执行

拦截器进入的时候是顺序执行,当invoke()后还有代码的时候,拦截器从action返回的时候又会倒序执行拦截器invoke()后的代码

b)自定义拦截器

定义拦截器的代码在struts.xml中,要放在package

<package name="system" namespace="/system" extends="struts-default">

<interceptors>

<interceptor name="authority"

class="com.wlm.iagtc.filter.LoginUserInterceptor">

interceptor>

<interceptor name="mylogin"

class="com.wlm.iagtc.filter.LoginUserInterceptor2">interceptor>

<interceptor-stack name="mydefault">

<interceptor-ref name="defaultStack" />

<interceptor-ref name="authority" />

<interceptor-ref name="mylogin" />

interceptor-stack>

interceptors>

<global-results>

<result name="login">/login.jspresult>

<result name="error">/error.jspresult>

global-results>

package>

注:<interceptor-ref name="defaultStack" /> 在定义拦截器栈的时候一定要把这句话加上,否则你的action中的requestresponse好像就没有用了,一直都报空指针异常。

如果你要应用这个拦截器栈在你的action中加入<interceptor-ref name="mydefault" />完整的写法

<action name="showAllUser" class="com.wlm.iagtc.action.ElecTextAction" method="showAll">

<result name="success">/showAll.jspresult>

<interceptor-ref name="mydefault" />

action>

这样在你访问showAllUser这个action的时候拦截器就会提前拦截这个action,如果符合条件在进入action

自定义的拦截器类

LoginUserInterceptor.java

package com.wlm.iagtc.filter;

import java.util.Map;

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginUserInterceptor extends AbstractInterceptor{

/**

*

*/

private static final long serialVersionUID = 1L;

@Override

public void init() {

System.out.println("第一个拦截器的初始化!!!");

super.init();

}

@Override

public String intercept(ActionInvocation invocation) throws Exception {

// 取得请求相关的ActionContext实例

ActionContext ctx = invocation.getInvocationContext();

Map session = ctx.getSession();

String user = (String)session.get("loginUser");

if(user != null && user.length()>0){

System.out.println("第一个拦截器拦截了!!!");

invocation.invoke();

}

ctx.put("message", "你还没有登录");

System.out.println("第一个拦截器拦截了--------------------------!!!");

return Action.SUCCESS;

}

@Override

public void destroy() {

System.out.println("第一个拦截器的结束");

super.destroy();

}

}

LoginUserInterceptor2.java

package com.wlm.iagtc.filter;

import java.util.Map;

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginUserInterceptor2 extends AbstractInterceptor{

@Override

public void init() {

System.out.println("第二个拦截器的初始化");

super.init();

}

@Override

public String intercept(ActionInvocation invocation) throws Exception {

// 取得请求相关的ActionContext实例

ActionContext ctx = invocation.getInvocationContext();

Map session = ctx.getSession();

String user = (String)session.get("loginUser");

System.out.println("第二个拦截器拦截了!!!");

if(user == "wlm"){

invocation.invoke();

}

System.out.println("第二个拦截器拦截了-------------------------------!!!");

return Action.SUCCESS;

}

@Override

public void destroy() {

System.out.println("第二个拦截器的结束");

super.destroy();

}

}

ssh中自定义监听器,拦截器,过滤器

相关推荐