谈一谈struts2和springmvc的拦截器
最近涉及到了两个项目,都需要考虑全局的拦截器,其功能就是判断session的登陆状态,如果session信息完好,可以从中取得相应的信息,则放行,否则拦截,进入重定向的uri。
既然是全局的拦截器,其拦截的东西当然会很多也就是会很忙,相应的其功能也会非常丰富,可以在其中进行多种功能的拦截,本文就只考虑session的拦截。
以前是使用Filter加一个全局的过滤器,过滤web.xml中配置的url,通过request获取session,如果符合判断条件,则放行,否则做出相应的处理。从原理上来说,使用框架的拦截器跟Filter是一样的,只不过封装的更好,更能更加强大,通用性更强。
从源码上来看:
Filter接口:
public interface Filter {
public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
public void destroy();
}
SpringMVC拦截器接口:
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
}
struts2拦截器接口:
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
可以看到接口中都是有三个方法,作用就是在做前置工作、本职工作、后续工作。但配置上稍有不同,先谈SpringMVC:
<servlet>
<servlet-name>JeeCmsAdmin</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/jeecms-servlet-admin.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JeeCmsAdmin</servlet-name>
<url-pattern>/jeeadmin/jeecms/*</url-pattern>
</servlet-mapping>
jeecms-servlet-admin.xml(部分)
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<ref bean="adminContextInterceptor"/>
<ref bean="adminLocaleIntercept"/>
<ref bean="fireWallInterceptor"/>
</list>
</property>
</bean>
<bean id="adminContextInterceptor" class="com.jeecms.cms.web.AdminContextInterceptor">
<property name="auth" value="true"/>
<property name="loginUrl" value="/jeeadmin/jeecms/login.do"/>
<property name="returnUrl" value="/jeeadmin/jeecms/index.do"/>
<property name="excludeUrls">
<list>
<value>/login.do</value>
<value>/logout.do</value>
</list>
</property>
</bean>
<bean id="adminLocaleIntercept" class="com.jeecms.cms.web.AdminLocaleInterceptor"/> <bean id="fireWallInterceptor" class="com.jeecms.cms.web.FireWallInterceptor">
</bean>
AdminContextInterceptor.java(部分)
- /**
- * 在业务处理器处理请求之前被调用
- * 如果返回false
- * 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
- *
- * 如果返回true
- * 执行下一个拦截器,直到所有的拦截器都执行完毕
- * 再执行被拦截的Controller
- * 然后进入拦截器链,
- * 从最后一个拦截器往回执行所有的postHandle()
- * 接着再从最后一个拦截器往回执行所有的afterCompletion()
- */
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// 获得站点
CmsSite site = getSite(request, response);
CmsUtils.setSite(request, site);
// Site加入线程变量
CmsThreadVariable.setSite(site);// 获得用户
CmsUser user = null;
if (adminId != null) {
// 指定管理员(开发状态)
user = cmsUserMng.findById(adminId);
if (user == null) {
throw new IllegalStateException("User ID=" + adminId
+ " not found!");
}
} else {
// 正常状态
Integer userId = authMng
.retrieveUserIdFromSession(session, request);
if (userId != null) {
user = cmsUserMng.findById(userId);
}
}
// 此时用户可以为null
CmsUtils.setUser(request, user);
// User加入线程变量
CmsThreadVariable.setUser(user);String uri = getURI(request);
// 不在验证的范围内
if (exclude(uri)) {
return true;
}
// 用户为null跳转到登陆页面
if (user == null) {
response.sendRedirect(getLoginUrl(request));
return false;
}
// 用户不是管理员,提示无权限。
if (!user.getAdmin()) {
request.setAttribute(MESSAGE, MessageResolver.getMessage(request,
"login.notAdmin"));
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return false;
}
// 不属于该站点的管理员,提示无权限。
if (!user.getSites().contains(site)) {
request.setAttribute(MESSAGE, MessageResolver.getMessage(request,
"login.notInSite"));
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return false;
}
boolean viewonly = user.getViewonlyAdmin();
// 没有访问权限,提示无权限。
if (auth && !user.isSuper()
&& !permistionPass(uri, user.getPerms(), viewonly)) {
request.setAttribute(MESSAGE, MessageResolver.getMessage(request,
"login.notPermission"));
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return false;
}
return true;
}
struts2的拦截器:
web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
从这个配置可以看出,struts2依然采取过滤器的方式,这个配置与过滤器一模一样,只是struts2进行了若干封装而已。
struts.xml配置:
<struts>
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.devMode" value="true" />
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 全局拦截器 add by fdk -->
<package name="checkLogin" extends="struts-default">
<interceptors>
<interceptor name="noLogin"
class="com.tjhq.exception.AuthorityInterceptor" />
<interceptor-stack name="appStack">
<interceptor-ref name="defaultStack" />(必须加,否则出错)
</interceptor-stack> <interceptor-stack
name="defaultPaginationInterceptorStack">(这句是设置所有Action自动调用的拦截器堆栈)
<interceptor-ref name="noLogin" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref
name="defaultPaginationInterceptorStack" /> <global-results>
<result name="login" type="redirect">${pageContext.request.contextPath}/login.jsp</result>
</global-results>
</package> <package name="strutsCheckLogin" extends="struts-default">
<interceptors>
<interceptor name="noLogin"
class="com.tjhq.exception.AuthorityInterceptor" />
<interceptor-stack name="appStack">
<interceptor-ref name="defaultStack" />
</interceptor-stack>
<interceptor-stack
name="defaultPaginationInterceptorStack">
<interceptor-ref name="noLogin" />
<interceptor-ref name="appStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultPaginationInterceptorStack" /> <global-results>
<result name="login" type="redirect">${pageContext.request.contextPath}/login.jsp</result>
<result name="noframe" type="redirect">${pageContext.request.contextPath}/pages/error.jsp</result>
</global-results> <global-exception-mappings>
<exception-mapping result="noframe" exception="com.tjhq.exception.AppException"></exception-mapping>
</global-exception-mappings>
</package>
<include file="struts2/pub.xml" />
<include file="struts2/collect.xml" />
<include file="struts2/audit.xml" />
<include file="struts2/publish.xml" />
<include file="struts2/search.xml" />
<include file="struts2/statistics.xml" />
<include file="struts2/sysmanager.xml" />
<include file="struts2/portal.xml" />
<include file="struts2/compre.xml" />
</struts>
AuthorityInterceptor.java
public String intercept(ActionInvocation ai) throws Exception {
ActionContext ctx = ai.getInvocationContext();
Map session = ctx.getSession();
if(ServletActionContext.getRequest().getSession().getAttribute(Constants.USER_ID_SESSION)==null){
this.setSessionByUserId(session);
}
String ACCOUNT_ID = (String)session.get(Constants.USER_ID_SESSION);
SysUserBean sb = (SysUserBean)session.get(Constants.USER_ACCOUNT_SESSION);
if(sb != null &&
ACCOUNT_ID != null && ACCOUNT_ID.length()>0){
_logger.info("user loginning");
return ai.invoke();//放行,进入下一个拦截器
}
_logger.info("intercept user is not login");
session.put("message", Dresource.getPropertie(Constants.PropertyKeys.NOT_LOGIN));
return "login";//进入上文蓝色位置
}
谈一谈struts2和springmvc的拦截器的更多相关文章
- SpringMVC——实现拦截器
1. SpringMVC拦截器的概念与Struts2相同 2. 实现拦截器 (1) 项目结构 (2) 实现HandlerInterceptor接口 package com.zhengbin.contr ...
- 转 :关于springmvc使用拦截器
原博客: http://elim.iteye.com/blog/1750680 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的 ...
- springmvc的拦截器
什么是拦截器 java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...
- SpringMVC利用拦截器防止SQL注入
引言 随着互联网的发展,人们在享受互联网带来的便捷的服务的时候,也面临着个人的隐私泄漏的问题.小到一个拥有用户系统的小型论坛,大到各个大型的银行机构,互联网安全问题都显得格外重要.而这些网站的背后,则 ...
- SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】
注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...
- 基于注解风格的Spring-MVC的拦截器
基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...
- SpringMVC 学习-拦截器 HandlerInterceptor 类
一.拦截器 HandlerInterceptor 类的作用 SpringMVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 二.怎么使用呢? 1. ...
- springMVC的拦截器工作流程
首先,springmvc的拦截器配置在这就不多说了.主要讲一下拦截器的三个方法的执行顺序. preHandle方法一定是最先执行的方法,如果它返回为false下面的方法均不执行. postHandle ...
- Struts2基础学习(五)—拦截器
一.概述 1.初识拦截器 Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...
随机推荐
- 设计模式--模板方法 And State模式
1.模板方法 钩子: 在抽象基类已经有默认的定义,子类选择是否覆盖它 在模板方法模式中, 抽象基类中使用 钩子函数(子类视情况是否覆盖) 来达到控制模板方法中 流程控制的 目的 设计原则: ...
- Spring3+SpingMVC+Hibernate4全注解环境配置
Spring3+SpingMVC+Hibernate4全注解环境配置 我没有使用maven,直接使用Eclipse创建动态Web项目,jar包复制在了lib下.这样做导致我马上概述的项目既依赖Ecli ...
- 【转】angularjs指令中的compile与link函数详解
这篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下 通常大家在 ...
- JQuery插件开发初探——图片轮播
在熟悉了插件开发的结构以后,自己尝试着做了一个稍微复杂一点的小功能:图片轮播插件. 由于之前使用的一款图片轮播插件,性能不高,页面加载的时候需要载入全部的图片,因此速度很慢. 通过自己做这个小插件,能 ...
- nginx做反向负载均衡,后端服务器获取真实客户端ip(转)
首先,在前端nginx上需要做如下配置: location / proxy_set_hearder host $host; proxy_set_header X-forw ...
- windows平台搭建lighttpd+php+sqlite
(一)php 1. 下载及安装 http://www.appservnetwork.com/ 从上面的网址下载appserv-win32-2.5.10并安装,在安装的时候,仅仅选择安装php. 由于, ...
- TreeMap cannot be cast to java.lang.Comparable
/** * Constructs a new, empty tree map, using the natural ordering of its * keys. All keys inserted ...
- SQL Server 有关EXCEPT和INTERSECT使用
熟练使用SQL Server各种使用会带来多大的方便查询.今天介绍EXCEPT和INTERSECT.请注意,这只是语法SQL Server 2005和以上版本支持. EXCEPT它指的是存在于所述第一 ...
- N-gram统计语言模型(总结)
N-gram统计语言模型 1.统计语言模型 自然语言从它产生開始,逐渐演变成一种上下文相关的信息表达和传递的方式.因此让计算机处理自然语言.一个主要的问题就是为自然语言这样的上下文相关特性建立数学模型 ...
- 大数据系列修炼-Scala课程03
前言 今天上班看了很多关于前端js,jQuery.bootstrap.js以及springMVC看得迷迷糊糊的,毕竟以前很少去学习前端的技术,所有看得有点困,还好看得比较多,回家后也开始学习关于Sca ...