众所周知,struts2拦截器主要功能是实现对action请求的拦截,当从jsp页面发送数据到action时,先经过拦截器进行处理,我现在有个疑问是struts2是不是只能针对于action进行拦截,如果是某个地址页面呢?它还能实现拦截的功能吗?
比如经常用到的权限验证问题,如果用户没有登录,那直接打开任何登录后的页面将会跳到登录首页,这是由拦截器来实现的,但是,大多数页面打开时并不能向action发送请求啊,那拦截器怎么去拦截?
比如经常用到的权限验证问题,如果用户没有登录,那直接打开任何登录后的页面将会跳到登录首页,这是由拦截器来实现的,但是,大多数页面打开时并不能向action发送请求啊,那拦截器怎么去拦截?
如果是*.action 那就只会拦截action 。 判断用户是否登录 ,这个可以自己定义一个拦截器嘛 ,import com.chenghui.entity.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;/**
* 验证用户是否登录
* @author Administrator
*
*/
public class CheckIsLoginInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = 5572804837134361839L; @Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
User user = (User)actionInvocation.getInvocationContext().getSession().get("user");
if(user==null){
ActionContext.getContext().getSession().put("loginMessage", "请先登录!");
return Action.LOGIN;
}
return actionInvocation.invoke();
}}然后 重新指定一下 默认的拦截器就ok了<package name="ch" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="checkIsLogin" class="com.jzaccp.interceptor.CheckIsLoginInterceptor"></interceptor>
<interceptor-stack name="crmDefaultStack">
<interceptor-ref name="checkIsLogin"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="crmDefaultStack"></default-interceptor-ref>
</package>不过有一个不好的地方,就是 只能拦截action ,所以 jsp什么的就没有办法拦截了后来我在现在的项目中发现好办法了,粘贴给你吧。package com.beyondbit.common.util;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;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;public class SessionFilter implements Filter { private FilterConfig config;
private List<String> excludedUrls = new ArrayList<String>(); /**
* 销毁
*/
@Override
public void destroy() {
// TODO Auto-generated method stub } /**
* 执行
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
// TODO Auto-generated method stub
boolean flag = true;
HttpServletRequest req = (HttpServletRequest) request;
String url = req.getRequestURI();
for (String one : excludedUrls) {
if (url.indexOf(one) != -1) {
flag = false;
break;
}
}
if (flag) {
Object obj = req.getSession().getAttribute("loginuser");
if (obj == null) {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect(PropertyManager.getProperty("contextPath") + "/common/validate-session.jsp");
} else {
chain.doFilter(request, response);
}
} else {
chain.doFilter(request, response);
} } /**
* 初始
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
config = arg0;
String s = config.getInitParameter("excludedUrls");
if (s != null) {
excludedUrls = StrUtils.split(s, ",");
}
}}
<!-- session Filter -->
<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>com.beyondbit.common.util.SessionFilter</filter-class>
<init-param>
<param-name>excludedUrls</param-name>
<param-value>/login!index.action,/login!logout.action,/login!login.action,/*/*.shtml,/system/article/article!getClickCounts.action,/system/article/article!addClickCount.action,</param-value>
</init-param>
</filter>
<!-- Filter 映射 -->
<filter-mapping>
<filter-name>sessionFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
那个初始化参数就是为了过滤你不需要拦截的请求,以逗号分隔~~~